используя sqldf () для выбора строк, которые соответствуют миллиону элементов - PullRequest
4 голосов
/ 19 марта 2012

Это ответ на вопрос, предоставленный здесь при использовании sqldf()

https://stackoverflow.com/a/1820610

В моем конкретном случае у меня есть файл с разделителями табуляции с более чем 110 миллионами строк. Я хотел бы выбрать строки, которые соответствуют 4,6 миллионам идентификаторов тегов.

В следующем коде идентификаторы тегов находятся в tag.query

Однако, хотя пример будет работать с меньшим запросом, он не обрабатывает вышеприведенный более крупный пример:

sql.query <- paste('select * from f where v2 in (', tag.query, ')', sep='')
selected.df <- sqldf(sql.query, dbname = tempfile(), file.format = list(header = F, row.names = F, sep="\t", skip=line.where.header.is))

Есть предложения по альтернативным методам оценки?

Ответы [ 2 ]

3 голосов
/ 20 марта 2012

Если проблема в скорости, попробуйте создать индекс на v2.См. Пример 4i на домашней странице sqldf .Если это все еще не достаточно быстро, вы также можете попробовать использовать другую базу данных.Как и SQLite по умолчанию, sqldf поддерживает H2, MySQL и PostgreSQL.

1 голос
/ 20 марта 2012

Вы должны действительно проиндексировать свою таблицу, как упоминалось ранее.Но базе данных SQLite не удается создать индекс с более чем 10 миллионами записей, это становится чрезвычайно медленным.Я пробовал с 40 миллионами записей, и он зависает.Я не знаю, как другие базы данных работают на CREATE INDEX для большой таблицы.

У меня была такая же проблема, и я закончил сортировку таблицы по идентификатору тега и записал ее в текстовый файл.Затем я написал бинарный поиск в C ++, который искал прямо в текстовом файле идентификаторы тегов.Это значительно ускорило выполнение, так как двоичный поиск - это O (log N) против O (N) для поиска в grep, где N - десятки миллионов.Я могу поделиться этим, если вам нужно.

...