Подтвердить что ты не робот

Самый быстрый способ подмножества - data.table и MySQL

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

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

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

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

4b9b3361

Ответ 1

Если данные установлены в ОЗУ, таблица данных быстрее. Если вы приведете пример, скорее всего, станет очевидным, что вы плохо используете таблицу data.table. Вы читали "do and do'ts" в data.table wiki?

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

Ответ 2

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

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

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

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

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