Наиболее эффективным способом будет блокировка за блоком, открытие всех файлов за раз и повторное использование буфера чтения для записи.Поскольку информация предоставляется, в данных нет другого шаблона, который можно было бы использовать для ее ускорения.
Вы будете открывать каждый файл в отдельном файловом дескрипторе, чтобы не открывать и не закрывать каждую строку.Открывайте их все в начале или лениво на ходу.Закройте их все, прежде чем закончить.В большинстве дистрибутивов Linux по умолчанию разрешено открывать только 1024 файла, поэтому вам придется увеличить лимит, скажем, с помощью ulimit -n 2600
, если у вас есть разрешение (см. Также /etc/security/limits.conf
).
Выделить буферскажем пару килобайт, и сырое чтение из исходного файла в него.Итерируйте и сохраняйте управляющие переменные.Всякий раз, когда вы достигаете конечной линии или конца буфера, пишите из буфера в правильный дескриптор файла.Есть несколько крайних случаев, которые вы должны принять во внимание, например, когда чтение получает новую строку, но недостаточно, чтобы выяснить, в какой файл следует войти.
Вы можете выполнить обратную итерацию, чтобы избежать обработкипервые несколько байтов буфера, если вы определите минимальный размер строки.Это окажется немного сложнее, но, тем не менее, ускорится.
Интересно, а неблокирующий ввод / вывод решает такие проблемы, как эта?