TL;DR
Какой самый быстрый способ получить почти нулевое время загрузки для набора данных pandas, который у меня есть в памяти, с помощью ray?
Фон
Я делаю приложение, которое использует полу-большие наборы данных (фреймы данных pandas от 100 МБ до 700 МБ) и пытаюсь сократить время каждого запроса. Для многих моих запросов загрузка данных составляет большую часть времени ответа. Наборы данных - это оптимизированные паркетные файлы (категории вместо строк и т. Д.), Которые считывают только нужные столбцы.
В настоящее время я использую наивный подход, который по запросу загружает требуемый набор данных (считывая 10-20 столбцов из 1000, которые мне нужны из набора данных), а затем отфильтровывает нужные мне строки.
Типичный запрос:
- Прочтите и проанализируйте контракт (~ 50-100 мс)
- Загрузите набор данных (10-20 столбцов) (400-1200 мс)
- Выполнить операции pandas (~ 50-100 мс)
- Сериализируйте результаты (50-100 мс)
Теперь я пытаюсь ускорить это (уменьшить или удалить шаг загрузки набора данных).
Вещи, которые я пробовал:
- Используйте новую фильтрацию на уровне строк в наборе данных Arrow, чтобы читать только те строки, которые мне нужны. Вероятно, это будет хороший способ в будущем, но на данный момент новый API-интерфейс Arrow Dataset, на который полагается, значительно медленнее, чем чтение полного файла с использованием устаревшего загрузчика.
- Оптимизируйте, черт возьми, наборы данных. Это хорошо работает до такой степени, что где вещи находятся в категориях, типы данных оптимизированы.
- Сохраните фрейм данных в Ray. Использование ray.put и ray.get. Однако на самом деле это не улучшает ситуацию, поскольку отнимающая много времени часть - десериализация фрейма данных.
- Поместите набор данных в ramfs. На самом деле это не улучшает ситуацию, поскольку отнимающая много времени часть - десериализация фрейма данных.
- Сохраните объект в другом хранилище Plasma (за пределами ray.put), но очевидно, что скорость такая же (хотя я мог бы получить некоторые другие преимущества)
Наборы данных представляют собой паркетные файлы, что уже довольно быстро для сериализации / десериализации. Обычно я выбираю около 10-20 столбцов (из 1000) и около 30-60% строк.
Есть хорошие идеи, как ускорить загрузку? Мне не удалось найти никаких операций с почти нулевым копированием для фреймов данных pandas (то есть без штрафа за сериализацию).
Вещи, о которых я думаю:
Размещение набора данных в акторе и использование одного актера на поток. Это, вероятно, дало бы актеру прямой доступ к фрейму данных без какой-либо сериализации, но потребовало бы от меня много обработки:
- Making sure I have an actor per thread
- Распределить запросы по потокам
- "Переработайте" актеров при обновлении набора данных.
С уважением, Никлас