Для типа проблемы, которую вы описываете, я подозреваю, что алгоритм, который вы используете для сравнения данных, будет иметь гораздо более существенный эффект, чем модель или язык ввода / вывода. На самом деле, распределение строк и поиск здесь могут быть более дорогими, чем что-либо еще.
Некоторые общие предложения, прежде чем написать это самостоятельно:
- Попробуйте запустить на более быстрой машине, если она у вас есть. Это будет иметь огромное значение.
- Ищите онлайн-инструмент для проведения различий в XML ... не пишите его самостоятельно.
Если вы собираетесь написать это на C # (или Java или C / C ++), я бы сделал следующее:
- Одновременное считывание довольно большого блока в память (скажем, между 200К и 1М)
- Выделите пустой блок, который в два раза больше этого размера (предполагается, что наихудший случай для каждого символа ->)
- Копировать из блока ввода в блок вывода, условно добавляя CRLF после каждого символа '>'.
- Запишите новый блок на диск.
- Повторяйте, пока все данные не будут обработаны.
Кроме того, вы могли бы также написать такую программу для запуска в нескольких потоках, чтобы, хотя один раз поток выполнял вставки CRLF в память, отдельный поток считывал блоки с диска. Этот тип распараллеливания сложен ... поэтому я бы сделал это, только если вам действительно нужна максимальная производительность.
Вот действительно простая программа на C #, с которой можно начать, если вам это нужно. Он принимает путь к входному файлу и путь к выводу в командной строке и выполняет искомую замену ('>' ==> CRLF). Этот пример оставляет желать лучшего (параллельная обработка, потоковая передача, некоторая проверка и т. Д.) ... но это должно быть достойное начало.
using System;
using System.IO;
namespace ExpandBrackets
{
class Program
{
static void Main(string[] args)
{
if (args.Length == 2)
{
using( StreamReader input = new StreamReader( args[0] ) )
using( StreamWriter output = new StreamWriter( args[1] ) )
{
int readSize = 0;
int blockSize = 100000;
char[] inBuffer = new char[blockSize];
char[] outBuffer = new char[blockSize*3];
while( ( readSize = input.ReadBlock( inBuffer, 0, blockSize ) ) > 0 )
{
int writeSize = TransformBlock( inBuffer, outBuffer, readSize );
output.Write( outBuffer, 0, writeSize );
}
}
}
else
{
Console.WriteLine( "Usage: repchar {inputfile} {outputfile}" );
}
}
private static int TransformBlock( char[] inBuffer, char[] outBuffer, int size )
{
int j = 0;
for( int i = 0; i < size; i++ )
{
outBuffer[j++] = inBuffer[i];
if (inBuffer[i] == '>') // append CR LF
{
outBuffer[j++] = '\r';
outBuffer[j++] = '\n';
}
}
return j;
}
}
}