Olá!
O primeiro ponto a considerar é o cache de disco, não sei afirmar em
Windows, mas no Linux, se tiver memória suficiente, teremos esse cenário:
1. Primeira vez que ler o arquivo de 1,3 GB, média 93 MB/s:
$ time cat teste.txt > /dev/null
real 0m14.302s
user 0m0.016s
sys 0m0.720s
2. Segunda vez, lê da memória, pois o Linux fez cache desse arquivo, 5,5
GB/s:
$ time cat teste.txt > /dev/null
real 0m0.236s
user 0m0.004s
sys 0m0.228s
3. Limpando o cache no Linux, volta-se ao "normal":
$ su -c 'echo 3 > /proc/sys/vm/drop_caches'
Senha:
$ time cat teste.txt > /dev/null
real 0m14.550s
user 0m0.020s
sys 0m0.712s
Como pode ver, uma vez lido, as próximas vezes pouco vai interessar esse
tempo de leitura para o ser humano esperar.
Outro ponto a considerar é se o arquivo de saída e entrada estão no
mesmo dispositivo, se sim, melhor jogar os dados de saída na memória e
depois gravar de uma vez, caso contrário pode-se ir gravando pra ganhar
tempo.
Em todo caso, vejo que o ganho de desempenho será sempre o melhor quando
a leitura é feita continuamente e de forma binária, sem parar para
processar a cada linha lida, assim sendo, é melhor ler numa thread um
bloco "grande" de dados, e processar em outra.
Mais um ponto é se o processamento desse bloco leva mais tempo que a
leitura de outro bloco do arquivo, se sim, melhor usar multiprocessamento.
Do mais, se tiver memória e processamento "abundante", para essa carga,
melhor ler tudo, processar e gravar a cada linha encontrada, pois a
gravação faz cache também, principalmente se for gravar no mesmo
dispositivo que vai ler, visto que aí estimo pouquíssimo ganho com
thread/multiprocessamento no final das contas.
--
[]'s
Junior Polegato