Так что вам нужна скорость. Такая скорость, скорее всего, требует C (хотя Perl может быть достаточно оптимизирован). К сожалению, буферизацию сложно сделать вручную в C, и медленно в Perl/Python/Java.
Итак, один из возможных путей к C-решению с наименьшим количеством боли, при условии, что вы можете работать в 64-битной системе и обрабатывать не более нескольких баджиллионов ТБ данных:
- открыть выходные файлы
mmap
весь входной файл
- запомнить текущую позицию
- сканировать до табуляции, суммируя значения ASCII по модулю количества файлов (возможно, сначала вычитая 31 из каждого символа), чтобы получить код
- сканировать до новой строки или EOF
- содержимое
mmap
'd. это массив. запись из начальной позиции в новую строку в выходной файл. Используйте write(2)
, а не fputs
или что-то в этом роде, чтобы не мешать буферизации библиотеки C.
- вернуться к 3, пока файл не будет закончен
Дружелюбное ядро позаботится о том, чтобы все происходило в памяти по мере того, как вы достигнете конца, поэтому вам не придется буферизовать себя.
Обратите внимание, что сопоставленный с памятью ввод-вывод не обязательно быстрее, чем вызовы read
/write
для массового ввода-вывода, что, по сути, и является, но это сделает код существенно проще, чем попытка самостоятельно написать логику буферизации. Решение Python, основанное на этом общем дизайне, также может быть достаточно быстрым.