Загружать слова в строках из файла в таблицу sqlite - PullRequest
0 голосов
/ 19 ноября 2011

Я сделал функцию в c #, чтобы читать построчно, а затем загружать строки в sqlite (s3db).

private void LoadFromDictionary()
    {
        Encoding enc = Encoding.GetEncoding(1250);
        using (StreamReader r = new StreamReader("c:\\Temp2\\dictionary.txt", enc))
        {
            string line = "";
            while ((line = r.ReadLine()) != null)
            {
                line = line.Trim();
                AddWord(line);
            }
        }
        MessageBox.Show("Finally :P", "Info");
    }

    private void AddWord(string w)
    {
        String insSQL = "insert into Words values(\"" + w + "\")";
        String strConn = @"Data Source=C:\Temp2\dictionary.s3db";
        SQLiteConnection conn = new SQLiteConnection(strConn);
        SQLiteDataAdapter da = new SQLiteDataAdapter(insSQL, strConn);
        da.Fill(dt);
        dataGridView1.DataSource = dt.DefaultView;
    }

Но разве это быстрее? Я создал таблицу с помощью приложения администратора sqlite. Может ли sqlite загрузить сам файл и сделать его в виде таблицы?


Я говорю о 3+ миллионах слов (одно слово в одной строке).

PS. пожалуйста, исправьте мою тему, если что-то не так:

Ответы [ 4 ]

3 голосов
/ 19 ноября 2011

Да, существует гораздо более быстрый метод, использующий следующие методы:

1) Одноразовое открытие соединения с базой данных

2) Использование параметризованной команды для повышения производительностии более низкие накладные расходы (не нужно использовать новые строки при каждом проходе).

3) Обернуть всю операцию в транзакции.Как правило, это улучшит вашу производительность.

Обратите внимание, что я не показываю откат транзакции или закрытие соединения, что также является рекомендациями, которые следует реализовать.

private void LoadFromDictionary()
    {
            Encoding enc = Encoding.GetEncoding(1250);
            string strConn = @"Data Source=C:\Temp2\dictionary.s3db";
            SqliteConnection conn = new SqliteConnection(strConn);

            conn.Open();

            string insSQL = "insert or ignore into wyrazy values(@Word)";

            DbCommand oCommand = conn.CreateCommand();

            oCommand.Connection = conn;
            oCommand.CommandText = insSQL;

            DbParameter oParameter = oCommand.CreateParameter();
            oParameter.Name = "@Word";
            oParameter.DbType = DbType.String;
            oParameter.Size = 100;

            oCommand.Parameters.Add(oParameter);

            DbTransaction oTransaction = conn.BeginTransaction();

            using (StreamReader r = new StreamReader("c:\\Temp2\\dictionary.txt", enc))
            {
                string line = "";
                while ((line = r.ReadLine()) != null)
                {
                    line = line.Trim();
                    if (!string.IsNullOrEmpty(line)) {
                      oParameter.Value = line;
                      oCommand.ExecuteNonQuery();
                    }
                }
            }
            oTransaction.Commit();

            conn.Close();

            MessageBox.Show("Finally :P", "Info");
        }
0 голосов
/ 19 ноября 2011

Я только что сделал это на днях, сначала использовал транзакцию и параметризовал запросы.Я смог загрузить 16 миллионов строк примерно за минуту, выполнив это.

internal static void FastInsertMany(DbConnection cnn)
{
  using (DbTransaction dbTrans = cnn.BeginTransaction())
  {
    using (DbCommand cmd = cnn.CreateCommand())
    {
      cmd.CommandText = "INSERT INTO TestCase(MyValue) VALUES(?)";

      DbParameter Field1 = cmd.CreateParameter();

      cmd.Parameters.Add(Field1);

      for (int n = 0; n < 100000; n++)
      {
        Field1.Value = n + 100000;
        cmd.ExecuteNonQuery();
      }
    }

    dbTrans.Commit();

  }
}
0 голосов
/ 19 ноября 2011

Использование транзакций обычно значительно ускоряет процесс, в зависимости от желаемого размера пакета.Я не на 100% знаком с DataAdapters и DataSources, но вместо того, чтобы создавать новое соединение каждый раз, чтобы вставить одну строку, измените код, чтобы использовать одно соединение, и используйте SQLiteConnection.BeginTransaction (), а когда вы закончите, вызовите Transaction.Commit.().

0 голосов
/ 19 ноября 2011

Вы можете попробовать массовая вставка . Читая эту статью, обратите особое внимание на параметризованные запросы, которые там используются и которые вы должны использовать вместо конкатенации строк в вашем образце в переменной insSQL.

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