При запуске PL/R на PostgreSQL может ли R обрабатывать данные больше, чем ОЗУ?
Когда я использую R с открытым исходным кодом, если не использую определенный пакет, невозможно обрабатывать наборы данных больше, чем объем оперативной памяти. Поэтому я хотел бы знать, возможно ли обрабатывать большие наборы данных, применяя функции PL/R внутри PostgreSQL.
Я не нашел никаких документов по этому поводу.
2 ответа
Как упомянул Хонг Оои, PL/R загружает интерпретатор R в бэкэнд-процесс PostgreSQL. Таким образом, ваш код R работает "в базе данных".
Не существует универсального способа справиться с ограничениями памяти, но есть как минимум два возможных варианта:
- определить пользовательский агрегат PostgreSQL и использовать вашу PL / R-функцию в качестве "конечной" функции. Таким образом, вы обрабатываете в группах, и, следовательно, меньше проблем с памятью. Для получения более подробной информации смотрите онлайн-документацию по PostgreSQL и документацию по PL / R (я не часто публикую в stackru, поэтому, к сожалению, он не позволит мне публиковать реальные URL-адреса для вас)
- Используйте функции pg.spi.cursor_open и pg.spi.cursor_fetch, установленные PL / R в интерпретаторе R, чтобы выложить данные в вашу функцию R порциями.
См. PL / R документы здесь: http://www.joeconway.com/plr/doc/index.html
Я предполагаю, что вы действительно хотели бы иметь data.frame, в котором данные перемещаются в и из базовой базы данных курсора прозрачно в ваш R-код. Это на моем долгосрочном TODO, но, к сожалению, я не смог найти время, чтобы решить это. Мне сказали, что Oracle R-коннектор имеет эту функцию, так что, кажется, это можно сделать. Патчи приветствуются;-)
Нет. PL/R просто запускает отдельный R-процесс для запуска вашего R-кода. При этом используются те же двоичные файлы и исполняемые файлы, что и в командной строке, поэтому все стандартные ограничения по-прежнему применяются.