Самый быстрый способ подмножества - data.table против MySQL - PullRequest
20 голосов
/ 06 июля 2011

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

Для этого я иногда использовал пакет data.table, который обеспечивает гораздо более высокие скорости, чем поднаборы с использованием фреймов данных. Недавно я начал экспериментировать с такими пакетами, как RMySQL, перенести некоторые таблицы в mysql и использовать пакет для запуска SQL-запросов и возврата результатов.

Я обнаружил смешанные улучшения производительности. Для небольших наборов данных (миллионов) кажется, что загрузка данных в таблицу data.table и установка правильных ключей обеспечивает более быструю поднаборку. Для больших наборов данных (от 10 до 100 миллионов) кажется, что отправка запроса в mysql происходит быстрее.

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

Ответы [ 2 ]

27 голосов
/ 06 июля 2011

Если данные помещаются в ОЗУ, data.table быстрее. Если вы приведете пример, то, вероятно, быстро станет ясно, что вы плохо используете data.table. Вы читали "что можно и чего нельзя делать" на data.table wiki ?

SQL имеет нижнюю границу, потому что это хранилище строк. Если данные помещаются в ОЗУ (а 64-битная - совсем немного), то data.table быстрее не только потому, что он находится в ОЗУ, но и потому, что столбцы расположены в памяти непрерывно (минимизация выборки страниц из ОЗУ в L2 для операций со столбцами). Используйте data.table правильно, и он должен быть быстрее, чем нижняя граница SQL. Это объясняется в FAQ 3.1. Если вы видите медленнее с data.table, то очень высоки шансы, что вы используете data.table неправильно (или есть ошибка производительности, которую мы должны исправить). Итак, пожалуйста, опубликуйте несколько тестов, прочитав вики data.table.

2 голосов
/ 06 июля 2011

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

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

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

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

Мне будет интересно услышать, что говорят другие. , ,

...