Чтение из БД и запись в файл - PullRequest
1 голос
/ 13 июля 2011

Сценарий - в базе данных огромные данные.Утилита использует datareader для чтения записей по одной и добавляет в файл txt / xml.Первоначально утилита использовалась для чтения одной записи, записи ее в файл;Затем я изменил его так, что около 10 тыс. Записей читаются и помещаются в память (stringbuilder), а затем записываются в файл и так далее.Сокращение времени было превосходным.

Итак, я думаю, что файловый ввод / вывод был узким местом.Я хочу улучшить это дальше.Думая использовать какой-то буфер, а затем использовать один поток для чтения из БД и помещения в буфер, а другой поток для извлечения из буфера и записи в файл.

Возможно ли это.Когда начать?Есть ли лучшие альтернативы?

Ответы [ 2 ]

0 голосов
/ 14 июля 2011

Если вам действительно нужна более высокая производительность, вы можете читать данные в виде фрагментов по 10 Кб, как вы делаете это сегодня, передавая начальные / конечные значения в базу данных и записывая их одновременно в отдельные файлы, используя несколько потоков.По завершении вы объединяете / объединяете / добавляете файлы.Запись в один файл может быть настолько улучшена только потому, что запись данных должна быть последовательной.

что-то вроде

using (var output = File.Create("output"))
{
    foreach (var file in new[] { "file1", "file2" })
    {
        using (var input = File.OpenRead(file))
        {
            input.CopyTo(output);
        }
    }
}

Не уверен, действительно ли это значительно повышает производительность,но стоит попробовать.

0 голосов
/ 13 июля 2011

Начальной точкой будет использование двух буферов и асинхронная запись содержимого буфера в файл.Что-то вроде:

buffera
bufferb
currentbuffer=buffera

fill currentbuffer with data
kickoff job to write currentbuffer to file
wait for previous write job to finish, if relevant.    
currentbuffer=otherbuffer

Повтор до полного завершения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...