Обработка огромных файлов в Java - PullRequest
8 голосов
/ 15 марта 2012

У меня огромный файл размером около 10 ГБ. Я должен делать такие операции, как сортировка, фильтрация и т. Д. Над файлами в Java. Каждая операция может выполняться параллельно.

Хорошо ли начинать 10 потоков и читать файл параллельно? Каждый поток читает 1 ГБ файла. Есть ли другой способ решить проблему с очень большими файлами и обработать их как можно быстрее? NIO хорош для таких сценариев?

В настоящее время я выполняю операции последовательно, и для обработки таких файлов требуется около 20 минут.

Спасибо

Ответы [ 2 ]

11 голосов
/ 15 марта 2012

Хорошо ли начинать 10 потоков и читать файл параллельно?

Почти наверняка нет - хотя это зависит.Если это от SSD (где фактически нет времени поиска), то возможно .Если это традиционный диск, определенно нет.

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

Не зная больше, чем "сортировать, фильтровать и т. Д." (Что довольно расплывчато), мы не можем сказать,насколько параллелизуем процесс в первую очередь - но попытка выполнить IO параллельно для одного файла вероятно не поможет.

1 голос
/ 15 марта 2012

Попробуйте профилировать код, чтобы увидеть узкие места.Вы пробовали, чтобы один поток прочитал весь файл (или как можно больше), и выделил это 10 потокам для обработки?Если файл ввода / вывода является вашим узким местом (что кажется правдоподобным), это должно улучшить общее время выполнения.

...