Использование sqlite для очень больших слияний и базовых запросов - PullRequest
3 голосов
/ 29 ноября 2010

Я новичок в базах данных и пытаюсь найти хорошее решение для работы с большими наборами данных. В основном я делаю статистический анализ с использованием R, поэтому мне не нужна база данных в качестве бэкэнда веб-страниц или чего-либо еще. По наборам данных вообще статичны - они просто большие.

Я пытался сделать простое левое соединение таблицы записей ~ 10 000 000 на таблице ~ 1 400 000. Таблица 1.4 м имела уникальные записи. После сбивания в течение 3 часов, оно вышло на меня. Запрос был указан правильно - я запустил его, ограничив количество поисков до 1000 записей, и он вернулся точно так, как я ожидал. В конце концов я нашел способ разделить это на 10 запросов, и он запустился, но к этому времени я смог сделать это слияние в R довольно быстро, без всяких причудливых вызовов sqlite и индексации.

Я искал использование баз данных, потому что думал, что они быстрее / эффективнее справляются с этими основными манипуляциями с данными, но, возможно, я просто что-то упускаю. В приведенном выше примере я проиндексировал соответствующие столбцы, и я удивлен, что sqlite не смог справиться с этим, в то время как R мог.

Извините, если этот вопрос немного туманный (я немного туманно отношусь к базам данных), но если у кого-то есть какие-либо советы по поводу чего-то очевидного, я делаю неправильно, чтобы не воспользоваться преимуществами sqlite, это было бы здорово , Или я просто многого ожидаю, а объединение записей размером 100 х 1,4 м слишком велико, чтобы его можно было выполнить, не разбивая его?

Я думаю, что база данных может превзойти R в этом отношении?

спасибо!

EXL

Ответы [ 2 ]

3 голосов
/ 29 ноября 2010

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

- RSQLite пакет

- RSQLite.extfuns пакет

- SQLite FAQ

Я все еще новичок, но в целом вы должны использовать SQLite для поднабора данных, которые слишком велики для ввода в ОЗУ. Я думаю, что если данные достаточно малы, чтобы обрабатывать их в оперативной памяти, то лучше использовать нативные инструменты R для соединений / подмножеств. Если вы обнаружите, что вам удобнее работать с SQL-запросами, существует пакет sqldf . Кроме того, JD Long проводит отличную дискуссию об использовании sqldf с большими наборами данных.

2 голосов
/ 29 ноября 2010

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

Я заметил, что мне нужно быть осторожным при перемещении данных в SQLite. Текст это просто. Однако иногда числа сохраняются в виде текста, а не чисел. Выполнение JOIN для столбца чисел выполняется быстрее, чем то же самое JOIN для столбца текста. Если ваши числовые столбцы сохраняются в виде текста, а затем сравниваются в числа для сравнения, вы потеряете большую часть преимущества использования индекса.

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

Не имея возможности увидеть основную структуру и запросы, ответами на этот вопрос будут образованные догадки.

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