@utopialvo
Data Scientist

Как загрузить большой датасет в память сервера (+ пара сопутсвующих проблем)?

Есть датасет (формат «raw», но отформатированный правильно для чтения pandas’ом) размерностью (4000, 20 000 000), который весит примерно 550гб. А также есть сервер со 112 ядрами, оперативной памятью 1.7 Тб и свопом 3 Тб.
Данные имеют следующий вид: Первые 6 столбцов - мусорные и не важны для обработки, оставшиеся содержат только 2, 1, 0 и Nan. Вопрос в следующем: возможно ли вообще загрузить данные в память сервера не используя инструментарий Big Data?
Мой путь и попытки решения вопроса:
Прямая попытка загрузить данные pandas’ом не увенчалась успехом. Как я понял, пандас плохо работает с данными, где количество столбцов исчисляется миллионами.
Через внешний инструмент транспонировал датасет. Данные теперь имеют вид (20 000 000, 4000), что по идее должно легко считаться пандасом. Далее, попытался вновь считать данные. Процесс пошел, но это привело к переполнению памяти сервера.
После загрузки в память, необходимо сократить размерность с помощью PCA. Думал разбить файл на куски по несколько миллионов, чтобы работать частями. Части действительно загружаются довольно быстро и работать с ними вполне возможно. Но, как я понимаю с математической точки зрения это сделать нельзя, так как компонентный анализ нужно производить именно на всем датасете, а не на его частях.
Ещё думал почистить данные от столбцов с нулевой и околонулевой дисперсией с помощью «VarianceThreshold» из библиотеки sklearn, чтобы уменьшить количество столбцов. Взял порог в 20% - т.е VarianceThreshold(0.2). Столкнулся со следующей ошибкой: «ValueError: No feature in X meets the variance threshold 0.20000». Как я понимаю, это означает, что все столбцы должны быть удалены?
  • Вопрос задан
  • 232 просмотра
Пригласить эксперта
Ответы на вопрос 2
ScriptKiddo
@ScriptKiddo
Думаю, для таких объемов лучше использовать какую-либо СУБД

1) Можете попробовать Clickhouse-local
https://clickhouse.com/docs/en/operations/utilitie...

$ echo -e "1,2\n3,4" | clickhouse-local --query "
    CREATE TABLE table (a Int64, b Int64) ENGINE = File(CSV, stdin);
    SELECT a, b FROM table;
    DROP TABLE table"
Read 2 rows, 32.00 B in 0.000 sec., 4987 rows/sec., 77.93 KiB/sec.
1   2
3   4


2) Также посмотрите на Dask + Parquet

https://docs.dask.org/en/stable/dataframe-best-pra...
https://docs.dask.org/en/stable/10-minutes-to-dask.html
Ответ написан
@rPman
Извиняюсь за неекропост

4000 колонок * 20кк строк * 1 байт значение (даже не надо в биты упаковывать, та ккак у вас 4 варианта значений)
это 80,000,000,000 байт, т.е. считанные 80 гигабайт данных в виде матрицы

какого вида нужна обработка? с линейным чтением справится просто массив
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы