2010-05-16 3 views
2

Я пишу приложение Java, которое, помимо прочего, должно читать текстовый файл словаря (каждая строка - одно слово) и хранить его в HashSet. Каждый раз, когда я запускаю приложение, этот же файл считывается снова (6-мегабайтный Unicode-файл).Скорость десериализации Java

Это казалось дорогим, поэтому я решил сериализовать полученный HashSet и сохранить его в двоичном файле. Я ожидал, что мое приложение будет работать быстрее после этого. Вместо этого он стал медленнее: от ~ 2,5 секунд до ~ 5 секунд после сериализации.

Ожидаемый результат? Я думал, что в подобных случаях сериализация должна увеличивать скорость.

+0

Насколько величен результирующий файл после сериализации? Это может также дать нам подсказку о скорости. – BalusC

+0

О том же. текстовый файл - 6.536.068, а сериализованный двоичный файл - 6.879.332. – celicni

+0

. 2 1/2 секунды - это не целая куча времени. Возможно, вы захотите предварительно обработать ваш файл, чтобы устранить пробелы, вы также можете попробовать закрепить его и провести бенчмаркинг, чтобы увидеть если это увеличивает скорость. –

ответ

5

Речь идет не о одном механизме сериализации, а о структуре данных, которую вы сериализуете.

У вас есть очень эффективное естественное представление этих слов: простой список в текстовом файле. Это быстро читать.

Вы создали структуру данных, чтобы сохранить их, которые являются разными: хеш-таблица. Для представления хеш-таблицы требуется больше памяти. Однако преимущество в том, что очень быстро искать слово по сравнению с простым списком.

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

Я думаю, вы должны придерживаться простого чтения текстового файла.

+0

Это кажется логичным. За исключением сериализованного двоичного файла не получилось намного больше, чем исходный текстовый файл с 6.536.068 по 6.879.332. – celicni

+0

В то время как оно не было * дольше *, оно было * более сложным *. Это то, что замедляется. –

+0

ОК, спасибо. Я возьму совет и придерживаюсь простого чтения. – celicni

2

@ Ответ Шона правильный. Сериализация/десериализация Java имеет существенные накладные расходы. Если вам нужно сделать словарь загрузка быстрее (или ...), рассмотрим следующие подходы:

  • Использование java.nio.* классов для чтения файла может ускорить процесс.
  • Если приложение не обязательно требует немедленного загрузки словаря при запуске, рассмотрите возможность использования отдельного потока для асинхронного ввода словаря. Загрузка словаря выполняется не быстрее, но (например) графический интерфейс приложения запускается в любом случае.
+0

Использование отдельного потока будет работать для меня. Спасибо за идею. – celicni

Смежные вопросы