Как импортировать большой объем данных из файла в sqlite внутри приложения (в режиме реального времени) - PullRequest
1 голос
/ 12 декабря 2010

У меня большой список слов (более 2 миллионов) в файле CSV (размер около 35 МБ).Я хотел импортировать файл CSV в sqlite3 с индексом (первичный ключ).Поэтому я импортировал его с помощью инструмента командной строки sqlite.Создана БД, а размер файла .sqlite вырос до более чем 120 МБ!(50% из-за индекса первичного ключа)

И здесь возникает проблема: если я добавлю этот файл .sqlite размером 120 МБ к ресурсам даже после сжатия в файл .ipa, он будет иметь размер> 60 МБ.И я хотел бы, чтобы он был меньше 30 МБ (из-за ограничения через E / 3G).

Также из-за размера, который я не могу импортировать (файл zlp sqlite) с помощью веб-службы (45 МБ *)1000 скачиваний = 45 ГБ! Это предел моего сервера на пол года).

Поэтому я подумал, что могу сделать что-то вроде этого:

  1. сжать файл CSV со словами в ZIP и затем файлбудет иметь только 7 МБ файла.
  2. добавить ZIP-файл к ресурсам.
  3. в приложении я могу разархивировать файл и импортировать данные из разархивированного CSV-файла в sqlite.

Но я не знаю, как это сделать.Я пытался сделать это:

sqlite3_exec(sqlite3_database, ".import mydata.csv mytable", callback, 0, &errMsg);

но это не работает.Причина сбоя заключается в том, что «.import» является частью интерфейса командной строки, а не в C API.

Поэтому мне нужно знать, как импортировать его (разархивированный CSV-файл) в файл SQLite внутри приложения (не во время разработки с использованием командной строки).

Ответы [ 3 ]

2 голосов
/ 12 декабря 2010

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

Если вы хотите только проверить, существуют ли слова в наборе (скажем, для проверки орфографии), вы можете использоватьальтернативная структура данных, такая как фильтр Блума, который требует только 9,6 битов для каждого слова с 1% ложных срабатываний.

http://en.wikipedia.org/wiki/Bloom_filter

1 голос
/ 12 декабря 2010

Как указано в FlightOfStairs, в зависимости от требований, фильтр Блума - это одно решение, если вам нужны полные данные, другое решение - использовать структуру данных trie или radix tree .Вы должны предварительно обработать свои данные и построить эти структуры данных, а затем либо поместить их в sqlite, либо в какой-либо другой внешний формат данных.

0 голосов
/ 12 декабря 2010

Самое простое решение - написать синтаксический анализатор CSV с помощью NSScanner и вставить строки в базу данных одну за другой. На самом деле это довольно простая работа - вы можете найти полный анализатор CSV здесь .

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