2012-04-19 3 views
2

В настоящее время я использую собственный CSV-класс из Codeproject для создания CSV-объекта. Затем я использую это для заполнения DataTable. При профилировании это занимает больше времени, чем хотелось бы, и мне интересно, есть ли более эффективный способ сделать это?Способы повышения производительности DataTable.Load()?

CSV содержит приблизительно 2500 строк и 500 столбцов.

Читатель CSV от: http://www.codeproject.com/Articles/9258/A-Fast-CSV-Reader

StreamReader s = new StreamReader(confirmedFilePath); 
CsvReader csv = new CsvReader(s, true); 
DataTable dt = new DataTable(); 
dt.Load(csv); 

Я наткнулся на поиск Google, предлагающей DataAdapter, но это только одна ссылка на это? Я искал дальше, но не нашел никакого сотрудничества.

+1

'При профилировании это занимает больше времени, чем мне хотелось бы". Не выполняйте настройку при выполнении операции. Профилирование - это очень большой процессор, память и интенсивность ввода-вывода. – Oded

+0

Я ценю это, но все это пропорционально остальной части кода. Я знаю, что код работает примерно в 5-7 раз медленнее ... поэтому я могу решить, как долго функция Load() принимает без профилировщика, и это еще немного. – mezamorphic

+0

Вы можете использовать 'секундомер', чтобы точно выполнить функцию. – Oded

ответ

0

Дайте GenericParser попробовать.

+1

-1: Пожалуйста, не публикуйте ответы, содержащие только ссылки. Разрыв ссылок. По крайней мере, укажите или укажите части страницы, которые отвечают на вопрос, и скажите спрашивающему _why_, вы думаете, что эта страница отвечает на их вопрос. –

1

CsvReader быстрый и надежный, я почти уверен, что вы не можете найти что-либо более быстрое (если оно вообще есть) для чтения CSV-данных.

Ограничение исходит от обработки данных DataTable новыми данными, 2500 * 500, что составляет сумму суммы. Я думаю, что самым быстрым способом будет прямая цепочка CsvReader-> DataBase (ADO.NET).

0

Всегда используйте BeginLoadData() и EndLoadData() при заполнении из баз данных, поскольку они уже применяют ограничения сами по себе. Единственным недостатком является то, что файл CSV, очевидно, не работает, поэтому любое исключение возникает только после завершения всей операции.

... 
dt.BeginLoadData(); 
dt.Load(csv, LoadOption.Upsert); 
dt.EndLoadData(); 

EDIT: Используйте LoadOption.Upsert только если DataBase пуст, или вы не хотите, чтобы сохранить все предыдущие изменения существующих данных - его еще более быстрее тот путь.