Улучшить производительность при разборе текстового файла

Прежде всего, извините за мой английский и за длину сообщения.

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

Для каждого пикселя в секретном изображении приложение ищет матрицу в файле схемы и записывает m пикселей в n долей (по одной строке для каждой доли).

Файл схемы содержит матрицы (n*m) для каждого цвета, необходимого для кодирования, и составлен следующим образом.

НАБОР ЦВЕТА 1
НАЧАТЬ МАТРИЦУ 1
RGB
GBR
BGR
КОНЕЦ
НАЧАТЬ МАТРИЦУ 2
.....
НАБОР ЦВЕТА 2
НАЧАТЬ МАТРИЦУ 1
XXX
XXX
XXX
КОНЕЦ
......
//

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

Для проверки производительности я создал синтаксический анализатор, который просто просматривает матрицу построчно, но он очень медленный.

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

Спасибо


person Vincenzo    schedule 23.12.2012    source источник
comment
если много тысяч - это что-то вроде 500 000, а средняя длина строки - 10 символов (20 байт), то получается 10 000 000 байт, что составляет всего 10 МБ. И это при условии, что вы храните строки как есть в памяти, а не используете компактное двоичное представление. Почему вы не можете прочитать матрицу в памяти, использовать ее для создания своих N изображений, а затем отбросить ее? 10 мегабайт это ничто. И даже если я ошибусь на один порядок, 100 мб это еще ничего.   -  person JB Nizet    schedule 23.12.2012
comment
насколько велики эти данные? Здесь можно загрузить данные в память или использовать последний использованный кеш?   -  person Farzad    schedule 23.12.2012
comment
я не могу читать в памяти, в основном потому, что это одна из целей проекта, а также потому, что файлы схемы могут быть большими, даже сотни мегабайт.   -  person Vincenzo    schedule 23.12.2012
comment
Я все еще думаю о том, как реализовать кеш, потому что, например, у меня есть тестовая схема только с 2 коллекциями (для черного и белого) и матрицей около 30000, и матрица должна быть выбрана случайным образом.   -  person Vincenzo    schedule 23.12.2012


Ответы (2)


Если вы действительно имеете дело с огромными входными файлами, которые превышают вашу способность загружать все это в ОЗУ, тогда используйте постоянное хранилище ключей/значений, например MapDB может быть простым способом сделать это. Разберите файл один раз и постройте эффективную карту [Коллекция+Цвет]->Матрица. Сохраните это в постоянном файле HTree. Это позаботится обо всем кэшировании и т. д. для вас. Обязательно создайте хорошую хэш-функцию для кортежа Collection+Color, и она должна быть очень производительной.

Если ваш шаблон доступа к данным имеет тенденцию накапливаться, возможно, будет быстрее сохранить его в индексе B+Tree — вы можете поиграть с этим и посмотреть, что работает лучше всего.

person Kevin Day    schedule 23.12.2012
comment
Спасибо, я попробовал MapDB с B+Tree и работает очень хорошо, только для коллекций с более чем 10000 матриц я получаю сообщение об ошибке. У меня есть одна карта для каждой коллекции BTreeMap‹Integer,String[]›, но иногда при вызове map.get (i) он возвращает объект и, следовательно, исключение ClassCastException. - person Vincenzo; 24.12.2012
comment
ОК - я думаю, что вы захотите отобразить Integer-›Matrix (не строковое представление, а реальный пригодный для использования объект). Если вы хотите опубликовать свой код на форуме MapDB, я уверен, Ян сможет его прокомментировать (или я это сделаю). Получение неправильного объекта из MapDB может произойти только в том случае, если десериализация не удалась, что вряд ли связано с проблемой библиотеки. - person Kevin Day; 24.12.2012

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

person fge    schedule 23.12.2012
comment
Спасибо, буду иметь в виду. Я должен сделать немного практики, чтобы использовать его хорошо! - person Vincenzo; 24.12.2012