Разработка базы данных sqlite с миллионами строк url ​​- медленный массовый импорт из csv - PullRequest
4 голосов
/ 05 июня 2011

Я пытаюсь создать базу данных sqlite, импортировав файл csv с URL-адресами. Файл содержит около 6 миллионов строк. Вот команды, которые я использовал

create table urltable (url text primary key);
.import csvfile urldatabase

После примерно 3 миллионов URL-адресов скорость сильно замедляется, и мой жесткий диск продолжает непрерывно вращаться. Я попытался разбить файл CSV на 1/4 части, но я столкнулся с той же проблемой.

Я читал похожие посты на stackoverflow и пытался использовать BEGIN...COMMIT блоки и PRAGMA synchronous=OFF, но ни один из них не помог. Единственный способ создать базу данных - это удалить ограничение первичный ключ из URL. Но затем, когда я запускаю команду select, чтобы найти конкретный URL-адрес, это занимает 2-3 секунды, что не будет работать для моего приложения. С первичным ключом, установленным на URL, выбор происходит мгновенно. Пожалуйста, сообщите мне, что я делаю не так.

[Изменить] Сводка предложений, которые помогли:

  • Уменьшить количество транзакций
  • Увеличение размера страницы и размера кэша
  • Добавить индекс позже
  • Удалить избыточность из URL

Тем не менее, при использовании основного индекса размер базы данных более чем в два раза превышает исходный файл CSV, который я пытался импортировать. Есть ли способ уменьшить это?

Ответы [ 2 ]

5 голосов
/ 05 июня 2011

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

PRAGMA page_size = 4096;
PRAGMA cache_size = 72500;

даст вам размер кэша чуть менее 300 МБ. Помните, что размер страницы должен быть установлен до создания базы данных. Размер страницы по умолчанию - 1024, а размер кэша по умолчанию - 2000.

В качестве альтернативы (или практически эквивалентно) вы можете создать базу данных полностью в базе данных в памяти, а затем использовать API резервного копирования для ее перемещения в базу данных на диске.

3 голосов
/ 05 июня 2011
Ограничение

A PRIMARY KEY или UNIQUE автоматически создаст индекс.Индекс значительно ускорит SELECT с, за счет замедления INSERT с.

Попробуйте импортировать ваши данные в неиндексированную таблицу, и затем явно CREATE UNIQUE INDEX _index_name ON urltable(url).Построение индекса может быть быстрее, чем одна строка за раз.

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