Я пытаюсь импортировать данные из файла csv в таблицу sqlite. Мои тестовые данные составляют всего около 8 МБ (50 000 строк) и занимают около 15 секунд. Однако производственные данные занимают почти 400 МБ и занимают вечность (по крайней мере, 30 минут +, я перестал ждать).
После долгих исследований я обнаружил необходимость вставки в одну транзакцию (это привело меня к 15-секундному импорту, отличный совет! :)) Так что это не проблема. (НАСКОЛЬКО МНЕ ИЗВЕСТНО)
Я также использую «ExecuteNonQuery() в параметризованном операторе INSERT» согласно этому сообщению Роберта Симпсона. - и многочисленные варианты.
Я просто использовал TextReader.ReadLine() и String.Split('\t'), затем я где-то прочитал о том, что ReadLine() работает медленно из-за количества операций чтения с диска, поэтому я изучил чтение буферизованного потока и наткнулся на эта программа чтения csv. Но по-прежнему никаких заметных изменений в производительности.
Итак, я закомментировал внутренности моего цикла вставки, и чтение происходит почти мгновенно, поэтому я уверен, что проблема в моей вставке. Я пробовал множество вариантов создания параметризованных запросов + одной транзакции, но все с почти идентичными результатами.
Вот обычная версия моего кода. Заранее спасибо, это сводит меня с ума! Я собираюсь попробовать импортировать в набор данных и вставить это?....
using (TextReader tr = File.OpenText(cFile))
{
using (SQLiteConnection cnn = new SQLiteConnection(connectionString))
{
string line;
string insertCommand = "INSERT INTO ImportTable VALUES (@P0,@P1,@P2,@P3,@P4)";
cnn.Open();
SQLiteCommand cmd = new SQLiteCommand("begin", cnn);
cmd.ExecuteNonQuery();
cmd.CommandText = insertCommand;
while ((line = tr.ReadLine()) != null)
{
string[] items = line.Split('\t');
cmd.Parameters.AddWithValue("@P0", items[0]);
cmd.Parameters.AddWithValue("@P1", items[1]);
cmd.Parameters.AddWithValue("@P2", items[2]);
cmd.Parameters.AddWithValue("@P3", items[3]);
cmd.Parameters.AddWithValue("@P4", items[4]);
cmd.ExecuteNonQuery();
}
cmd.CommandText = "end";
cmd.ExecuteNonQuery();
}
}
Обновление: я только что попытался использовать вставку с параметрами (просто жестко закодировал некоторые значения), менее 5 секунд... все еще не так быстро, как статьи, которые я видел...
Кроме того, я использую Core2 Duo (3Ghz) с 2G Ram, XP.
beginиendработают? Заметите ли вы изменение времени выполнения, если их убрать? - person Daniel Hilgarth   schedule 10.03.2011