У меня есть программа, в которой каждый поток читает из файла много строк за раз, обрабатывает строки и записывает строки в другой файл.Четыре потока разделяют список файлов для обработки среди них.У меня возникают странные проблемы с производительностью в двух случаях:
- Четыре файла по 50000 строк в каждом
- Пропускная способность начинается при обработке 700 строк / сек, снижается до ~ 100 строк / сек
- 30 000 файлов по 12 строк в каждом
- Пропускная способность начинается около 800 строк / сек и остается постоянной
Это внутреннееПрограммное обеспечение, над которым я работаю, поэтому, к сожалению, я не могу поделиться исходным кодом, но основные шаги программы:
- Разделение списка файлов по четырем рабочим потокам
- Пусквсе потоки.
- Поток считывает до 100 строк одновременно и сохраняет в массиве
String[]
. - Поток применяет преобразование ко всем строкам в массиве.
- Поток записывает строки вфайл (не совпадает с входным файлом).
- 3-5 повторяется для каждого потока, пока все файлы не будут полностью обработаны.
Чего я не понимаю, так это почему 30 тысяч файлов с 12каждая строка дает мне большую производительность, чем несколько файлов с человекому строк каждая.Я ожидал бы, что накладные расходы на открытие и закрытие файлов будут больше, чем на чтение одного файла.Кроме того, снижение производительности в первом случае носит экспоненциальный характер.
Я установил максимальный размер кучи равным 1024 МБ, и, похоже, он использует максимум 100 МБ, поэтому перегруженный GC неэта проблема.У вас есть другие идеи?