2014-01-20 5 views
0

У меня простая база данных sqlite с только одной таблицей и 7-8 строковыми полями с ~ 2.000.000 записями. Файл базы данных на диске составляет около 450-500 мб ...Использование памяти SQLIte в C#

Когда я открываю файл db в своем приложении C# и выполняю простой запрос «select * from tbl», использование памяти компьютера составляет 3gb.

Вот код, я использую для выбора данных из базы данных:

 DataSet ds = new DataSet(); 
     dataGridView1.DataSource = null; 
     string s = Cstr(); 
     try 
     { 

      SQLiteConnection conn = new SQLiteConnection(s); 
      SQLiteCommand command = new SQLiteCommand(conn); 
      command.CommandText = "select * from log;"; 
      conn.Open(); 
      command.ExecuteReader(); 
      var da = new SQLiteDataAdapter(command.CommandText, conn); 
      da.Fill(ds); 

      dataGridView1.DataSource = ds.Tables[0]; 
      conn.Close(); 
      GC.Collect(); 

     } 
     catch (Exception) 
     { 
     } 

Я попробовал то же самое с MySQL5 дб и использованием памяти нормально для базы данных такого размера. Редактировать: Я попытался загрузить ту же базу данных sqlite с помощью Delphi XE5 и использует только ~ 600 МБ памяти.

Есть ли способ избежать этого?

ответ

3

Это не авторитетный ответ на этот вопрос, но я подозреваю, что причиной является то, что вы видите.

SQLite - это система управления базами данных в процессе. Таким образом, когда вы выполняете этот запрос, который выбирает все записи в вашей таблице из 2000 000 строк, вы по существу загружаете все эти данные в память в комплекте с накладными расходами, которые исходят из любых структур данных индекса, используемых SQLite для ссылки на данные.

Сравните с MySQL, который работает как отдельный процесс. Скорее всего, когда вы отправляете запрос SELECT * FROM .. в MySQL через драйвер доступа к данным MySQL, он действительно не отправляет обратно все данные одновременно, но вместо этого вы возвращаете результаты постепенно, так как вы читаете следующую запись через DataReader ,

+1

хорошо у вас есть точка. относительно размера самого файла SqlLite его достаточно большого и необходимо полностью загрузить в память (я не уверен), но одно странное - почему его компьютер достигает загрузки 3 ГБ памяти? это действительно странно. Я попробовал себя сейчас на пустом проекте C# .NET 4.0, читающем старый файл SQLlite объемом 1,2 ГБ. в моей памяти компьютера он потребляет всего ~ 80 МБ –

0

Я столкнулся с этой проблемой ранее с C# .net framework 4.0 и здесь были мои наблюдения.

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

Обходной путь, который я пришел для решения этой проблемы, состоял в том, чтобы посвятить себя использованию транзакции во время операций CRUD и использованию подготовленных операторов.

+0

Я ничего не делаю, кроме одного запроса «select». Я добавлю код, чтобы уточнить вопрос. –

Смежные вопросы