Я профилировал код и обнаружил, что
в то время как использование памяти для чтения файлов возрастает в
Гига байты часто (от 1 до 3 ГБ) и
потом вдруг приходит в норму. Это
Кажется, что это часто высокие и низкие
память использует зависает мой сервер. из
Конечно, это было из-за мусора
коллекция.
Использование BufferedReader(new FileReader(...))
не приведет к этому.
Я подозреваю, что проблема в том, что вы читаете строки / строки в массив или список, обрабатываете их и затем отбрасываете массив / список. Это приведет к увеличению использования памяти, а затем уменьшится снова. В этом случае вы можете уменьшить использование памяти, обрабатывая каждую строку / строку по мере ее чтения.
РЕДАКТИРОВАТЬ : Мы согласны с тем, что проблема заключается в пространстве, используемом для представления содержимого файла в памяти. Альтернативой огромной хеш-таблице в памяти является возврат к старому подходу «сортировки слиянием», который мы использовали при измерении памяти компьютера в килобайтах. (Я предполагаю, что в обработке преобладает шаг, на котором вы выполняете поиск по ключам K, чтобы получить связанную строку R.)
При необходимости предварительно обработать каждый из входных файлов, чтобы их можно было отсортировать по ключу K.
Используйте эффективную утилиту сортировки файлов, чтобы отсортировать все входные файлы по порядку на K. Вы хотите использовать утилиту, которая будет использовать классический алгоритм сортировки слиянием. Это будет
разбить каждый файл на более мелкие порции, которые можно отсортировать в памяти, отсортировать порции, записать их во временные файлы, а затем объединить отсортированные временные файлы. Утилита UNIX / Linux sort
является хорошим вариантом.
Чтение отсортированных файлов параллельно, чтение всех строк, относящихся к каждому значению ключа, из всех файлов, их обработка, а затем переход к следующему значению ключа.
На самом деле, я немного удивлен, что использование BerkeleyDB не помогло. Однако, если профилирование говорит вам, что на сборку БД уходит больше всего времени, вы можете ускорить его, отсортировав входной файл (как указано выше!) В порядке возрастания ключей, прежде чем создавать БД. (При создании большого файлового индекса вы получаете лучшую производительность, если записи добавляются в ключевом порядке.)