оптимизация записи больших CSV-файлов — чтения больших таблиц с использованием TPL PLINQ

Любые советы о том, как я могу оптимизировать ниже, используя TPL и/или PLINQ.

Код ниже работает в фоновом режиме

Read a large table using sql reader 
Open stream writer to write a large csv file
while (reader.read())
{
   massage the data, parse data from columns etc. 
   create csv string to write to file
   write csv line to file
}
close reader
close file

Спасибо.


person Gullu    schedule 01.06.2011    source источник
comment
Можете ли вы вставить весь набор данных в свое приложение (или, по крайней мере, большую часть набора данных?), Это позволит вам выполнять шаг massage the data, parse data from columns etc. параллельно с несколькими записями одновременно. В противном случае вы своего рода SOL, поскольку я предполагаю, что записи должны происходить в определенном порядке.   -  person R0MANARMY    schedule 06.06.2011
comment
Нет, слишком большой для загрузки всего набора данных. спасибо   -  person Gullu    schedule 09.06.2011


Ответы (2)


Вы можете повысить производительность, записав данные строки csv в StringBuilder (т.е. в памяти), а затем записав содержимое в свой файл csv. Я бы предложил использовать оба метода вместе с профилировщиком памяти, таким как ANTS или продукт JetBrains.

person Kane    schedule 08.06.2011
comment
Принимает ли потоковый писатель построитель строк? Я рассмотрю это, а также профиль, как вы упомянули. спасибо - person Gullu; 09.06.2011
comment
Это запрашивает исключение из памяти. Вместо этого он мог бы просто увеличить размер буфера для своего FileStream, чтобы сделать его более чистым и более контролируемым. Но, честно говоря, я очень сомневаюсь, что написание CSV как-то влияет на производительность здесь. - person Ilia G; 09.06.2011

определите «дальнейшую оптимизацию» ... Вы хотите больше скорости или меньше памяти?

Предполагая, что приведенный выше псевдокод реализован правильно, использование памяти уже должно быть минимальным.

Скорость? Основываясь на заявлении о том, что вы работаете с большим набором данных, считыватель данных будет вашим самым большим источником медлительности. Поэтому, если вы действительно хотите использовать параллельную обработку, вам придется фрагментировать набор данных (предположительно, открывать несколько считывателей?)

Но опять же, вы уже запускаете его в фоновом режиме, так что это действительно имеет значение?

person Ilia G    schedule 08.06.2011
comment
Мне нравится идея нескольких читателей, когда один читатель читает сверху вниз, а другой читатель читает снизу вверх (используя трюк с порядком по возрастанию и убыванию на двух считывателях). Таким образом, я могу встретиться где-то посередине и разделить эту задачу. Я проверю свою логику, чтобы увидеть, возможно ли это. Благодарность - person Gullu; 09.06.2011