Какова самая эффективная библиотека Java Collections? [закрытый]

Если df_diesel является фреймом данных Pandas, я предлагаю вам использовать функцию df.plot(), так как она вам больше подходит:

df_diesel[['DATE', 'price']].plot()
plt.show()

Что касается вашего сообщения об ошибке, было бы очень полезно если вы объяснили, что вы имеете в виду под «переходом на день» (частотой повторной выборки?), а также, возможно, привели небольшой пример того, как выглядят ваши данные. Убедитесь, что столбец DATE относится к типу datetime, возможно, это так и есть.

135
задан Community 23 May 2017 в 12:26
поделиться

11 ответов

От контроля похоже, что Находка является просто библиотекой наборов для типов примитивов - это не похоже, это предназначено для добавления большой функциональности по нормальным наборам в JDK.

Лично (и я смещаюсь) я люблю Гуава (включая бывший проект Google Java Collections). Это делает различные задачи (включая наборы) намного легче, способом который по крайней мере довольно эффективен. Учитывая, что операции набора редко формируют узкое место в моем коде (по моему опыту), это "лучше", чем API наборов, который может быть более эффективным, но не делает мой код как читаемый.

, Учитывая, что перекрытие между Находкой и Гуавой является в значительной степени нолем, возможно, Вы могли разъяснить то, что Вы на самом деле ищете из библиотеки наборов.

72
ответ дан 23 November 2019 в 23:45
поделиться

Поскольку другие комментаторы заметили, определение "эффективных" бросков широкая сеть. Однако никто еще не упомянул библиотека Javolution .

Некоторые выделения:

  • классы Javolution быстры, очень быстро (например, Вставка текста / удаление в O [Журнал (n)] вместо O [n] для стандартного StringBuffer/StringBuilder).
  • Все классы Javolution являются совместимым жестким реальным временем и имеют очень детерминированное поведение (в диапазоне микросекунды). Кроме того (в отличие от стандартной библиотеки), Javolution является сейфом RTSJ (никакое столкновение памяти или утечка памяти при использовании с Java расширение В реальном времени).
  • классы набора Javolution в реальном времени (карта, список, таблица и набор) могут использоваться вместо большинства стандартных классов набора и обеспечить дополнительную функциональность.
  • наборы Javolution обеспечивают гарантии параллелизма для создания реализации параллельных алгоритмов легче.

распределение Javolution включает комплект сравнительного теста, таким образом, Вы видите, как они складывают против других библиотек / встроенные наборы.

19
ответ дан 23 November 2019 в 23:45
поделиться

java.util

Извините за очевидный ответ, но для большей части использования, значение по умолчанию Наборы Java более, чем достаточны.

6
ответ дан 23 November 2019 в 23:45
поделиться

Некоторый набор освобождает для рассмотрения:

, которого я прежде всего достиг бы для библиотеки набора JDK. Это покрывает наиболее распространенные вещи, которые Вы должны сделать и очевидно уже доступны Вам.

Google Collections является, вероятно, лучшей высококачественной библиотекой вне JDK. Это в большой степени используется и хорошо поддерживается.

Apache Наборы палаты общин являются более старыми и переносят немного от "слишком многих поваров" проблему, но имеют много полезного материала также.

у Trove есть очень специализированные наборы для случаев как примитивные ключи/значения. В эти дни мы находим, что на современном JDKs и с Java 5 + наборы и параллельные варианты использования, наборы JDK превосходят по характеристикам даже специализированные наборы Trove.

, Если у Вас есть действительно высокие варианты использования параллелизма, необходимо определенно проверить материал как NonBlockingHashMap в крупномасштабном lib, который является реализацией без блокировок и может топать на ConcurrentHashMap, если у Вас есть правильный вариант использования для него.

15
ответ дан 23 November 2019 в 23:45
поделиться

Для хранения миллионов из String в карте смотрите на http://code.google.com/p/flatmap

6
ответ дан 23 November 2019 в 23:45
поделиться

ConcurrentHashMap, а также java.util.concurrent пакет должен быть упомянут, если Вы планируете использовать HashMap в нескольких потоках. небольшой объем потребляемой памяти гарантируют, так как это - часть стандартного Java.

3
ответ дан 23 November 2019 в 23:45
поделиться

Зависит от того, как мы определяем "эффективный".

Каждая структура данных имеет свое собственное Большое О поведение для чтения, записи, итерации, объема потребляемой памяти, и т.д. Связанный список в одной библиотеке, вероятно, совпадет с любым другим. И карта хеша будет быстрее для чтения O (1), чем связанный список O (n).

, Но когда я прочитал ответы на вопрос "Большинство полезных свободных библиотек Java?" Я заметил, что находка едва упоминается.

Это не походит "самый эффективный". Это походит "самый популярный" мне.

Просто некоторая обратная связь - я никогда не слышал о нем, и я не знаю никого, кто использовал его. Наборы, встроенные в JDK, Google или Apache палата общин, известны мне.

3
ответ дан 23 November 2019 в 23:45
поделиться

Вопрос (теперь) о хранении большого количества данных, которые могут быть представлены с помощью типов примитивов как int в Карте. Некоторые ответы здесь являются очень вводящими в заблуждение, по-моему. Давайте посмотрим почему.

я изменил сравнительный тест от [1 111] находка для измерения и и потребления памяти во время выполнения. Я также добавил PCJ к этому сравнительному тесту, который является другой библиотекой наборов для типов примитивов (я использую тот экстенсивно). 'Официальный' сравнительный тест находки не сравнивает IntIntMaps с Набором Java Map<Integer, Integer>, вероятно, хранить Integers и хранение ints не являются тем же с технической точки зрения. Но пользователь не мог бы заботиться об этой технической детали, он хочет хранить данные, представимые с ints эффективно.

Сначала соответствующая часть кода:

new Operation() {

     private long usedMem() {
        System.gc();
        return Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
     }

     // trove
     public void ours() {
        long mem = usedMem();
        TIntIntHashMap ours = new TIntIntHashMap(SET_SIZE);
        for ( int i = dataset.size(); i-- > 0; ) {
           ours.put(i, i);
        }
        mem = usedMem() - mem;
        System.err.println("trove " + mem + " bytes");
        ours.clear();
     }

     public void pcj() {
        long mem = usedMem();
        IntKeyIntMap map = new IntKeyIntOpenHashMap(SET_SIZE);
        for ( int i = dataset.size(); i-- > 0; ) {
           map.put(i, i);
        }
        mem = usedMem() - mem;
        System.err.println("pcj " + mem + " bytes");
        map.clear();
     }

     // java collections
     public void theirs() {
        long mem = usedMem();
        Map<Integer, Integer> map = new HashMap<Integer, Integer>(SET_SIZE);
        for ( int i = dataset.size(); i-- > 0; ) {
           map.put(i, i);
        }
        mem = usedMem() - mem;
        System.err.println("java " + mem + " bytes");
        map.clear();
     }

я предполагаю, что данные стали примитивными ints, который кажется нормальным. Но это подразумевает штраф во время выполнения за Java util из-за автоупаковки, которая не необходима для примитивных платформ наборов.

результаты во время выполнения (без gc() вызовы, конечно) на WinXP, jdk1.6.0_10:

                      100000 put operations      100000 contains operations 
java collections             1938 ms                        203 ms
trove                         234 ms                        125 ms
pcj                           516 ms                         94 ms

, В то время как это могло бы уже казаться решительным, это не причина использовать такую платформу.

причиной является производительность памяти. Результаты для Карты, содержащей 100000 int записи:

java collections        oscillates between 6644536 and 7168840 bytes
trove                                      1853296 bytes
pcj                                        1866112 bytes

потребности Наборов Java больше чем три раза память по сравнению с примитивными платформами набора. Т.е. можно сохранить в три раза больше данных в памяти, не обращаясь к диску IO, который понижает производительность во время выполнения величинами. И это имеет значение. Читайте highscalability для обнаружения почему.

, По моему опыту, потребление верхней памяти является самой большой проблемой производительности с Java, который, конечно, приводит к худшей производительности во время выполнения также. Примитивные платформы набора могут действительно помочь здесь.

Так: Нет, java.util не является ответом. И "добавление функциональности" к наборам Java не является точкой, спрашивая об эффективности. Также современные наборы JDK делают не , "превосходят по характеристикам даже специализированные наборы Находки".

Правовая оговорка: сравнительный тест здесь совсем не завершен, и при этом это не прекрасно. Это предназначено, чтобы убедительно доказать точку зрения, которую я испытал во многих проектах. Примитивные наборы достаточно полезны для признания подозрительного API - , если Вы работаете с большим количеством данных.

103
ответ дан 23 November 2019 в 23:45
поделиться

Находка предлагает несколько преимуществ.

  • меньший объем потребляемой памяти, это не делает используемой Карты. Объекты записи
  • можно использовать стратегии хеша вместо этого ключи для карт, это сохраняет память и означает, что Вы не должны определять новый ключ каждый раз, когда Вы хотите кэшировать объект на новом наборе его атрибутов
  • , она имеет примитивные типы набора
  • , думают, что она имеет некоторую форму внутреннего итератора

Тем не менее, много было сделано для улучшения jdk наборов, так как находка была записана.

Это - стратегии хеширования, которые делают его обращающийся ко мне хотя... Google для находки и прочитал их обзор.

3
ответ дан 23 November 2019 в 23:45
поделиться

Если Вы хотите сохранить миллионы записей в хэш-таблице, возможности состоят в том, что Вы столкнетесь с проблемами памяти. Это произошло со мной, когда я пытался создать карту с 2,3 миллионами Строковых объектов, например. Я пошел с BerkeleyDB, который очень зрел и работает хорошо. У них есть API Java, который обертывает API Наборов, таким образом, можно легко создать произвольно большие карты с очень небольшим объемом потребляемой памяти. Доступ будет медленнее, хотя (поскольку он хранится на диске).

Последующий вопрос : существует ли достойное (и эффективно), хорошо сохраняемый, библиотека для неизменных наборов? Clojure имеет превосходную поддержку этого, и было бы хорошо иметь что-то подобное для Java.

2
ответ дан 23 November 2019 в 23:45
поделиться

Я разработчик happy-collections из happy-collections на source-forge

  1. Коллекции на основе событий
  2. Не изменяемый
  3. SortedList
  4. Кэш
4
ответ дан 23 November 2019 в 23:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: