А как вы читаете DataFrem объемом более 10 GB?

17.07.2018, 06:06:18
Добрый день, сначала немного о себе, а то сразу яйцами закидаете. Python я начал учить месяцев 8 назад, до этого программированием не занимался. За это время реализовал лишь один проект — написал бота для VK.com под конкретный функционал. Иными словами опыта у меня «0»! Очень интересна тема машинного обучения, прослушал курсы от Stepik и OpenDataScience (Mail.ru), дочитываю книгу по введению в машинное обучение.

У меня есть машина с 2 GB оперативки, 1 GB съедает система. Следовательно читать такой массив данных могу только построчно. Долго думал как это реализовать, в итоге написал класс который должен прочитать весь DataFrame и спарсить счетчики из столбцов 3 — 5 для дальнейшей «векторизации» массива. Потратил три вечера на отладку и поиск багов. И вот уже 9 часов я построчно считываю DataFrame, парсю столбы 3 — 5 (через регулярки). А ведь я даже не приступил к обучению модели))) (при этом комп трогать нельзя, тупит страшно)

Вопрос - как правильно читать такой объем данных?
Отредактировано 17.07.2018, 06:08:41
17.07.2018, 06:07:26
это сообщение было написано ошибочно и удалено :)
Отредактировано 17.07.2018, 06:21:42
17.07.2018, 07:39:10
Парсить JSON лучше все таки парсилкой JSON'а а не регулярками, так быстрее. С таким объемом оперативки ответ один, никак. Тут https://mlbootcamp.ru/forums/topic/27/ советуют https://colab.research.google.com как бесплатный ноутбук с 12 Гб оперативки, если будет хотеться больше то у https://cloud.google.com/ есть бесплатные 300$ на год на которые можно арендовать машину до 52 Гб оперативки, на время конкурса точно хватит.
17.07.2018, 08:53:08
rekcahd
Парсить JSON лучше все таки парсилкой JSON'а а не регулярками, так быстрее.

Спасибо, мне даже как-то в голову и не пришло что это JSON (стыдно конечно, ведь это первое о чем я должен был подумать).

rekcahd
https://colab.research.google.com как бесплатный ноутбук с 12 Гб оперативки

Да спасибо, сегодня тоже видел это сообщение, но пока не разобрался как загрузить в него данные, ведь они в архиве.
Я их разархивировал загрузил на drive.google, а он не дает прямую ссылку на файлы, не получается скачать.
С учетом того, что работы много, разбираться буду уже вечером.

А за JSON спасибо )))
Отредактировано 17.07.2018, 08:53:32
18.07.2018, 06:37:24
Так то есть ещё всякий там Dask для работы с не умещающимися в памяти данными, но это уже для готовых DataFrame хорошо, да и с таким кол-вом оперативки всё-равно толку не будет.
18.07.2018, 19:35:08
GTPSE
Да спасибо, сегодня тоже видел это сообщение, но пока не разобрался как загрузить в него данные, ведь они в архиве.
Я их разархивировал загрузил на drive.google, а он не дает прямую ссылку на файлы, не получается скачать.
С учетом того, что работы много, разбираться буду уже вечером.
Там есть возможность

from google.colab import files
files.upload()
Отредактировано 18.07.2018, 19:35:17
19.07.2018, 11:09:14
У pandas.DataFrame есть параметр chunksizе, в котором задается, сколько строк за раз читать, можно итерироваться с его использованием и делать на частях то, что надо.
20.07.2018, 16:31:17
К сожалению, задачи по ML похоже вырождаются к тому, что первые места будут у тех, у кого просто мощнее компы… Более менее что-то посчитать стало получаться когда объем оперативки дорастил до 48ГБ.. А все извращения с чанками и прочими кусочками - теоретически они может и работают, но настолько медленно, что в реальности использовать невозможно.
21.07.2018, 15:28:47
Олег Черемисин
У pandas.DataFrame есть параметр chunksizе, в котором задается, сколько строк за раз читать, можно итерироваться с его использованием и делать на частях то, что надо.
Добрый вечер. По советам выше заменил регулярки на парсер JSON, получил прирост производительности 5%. Потом решил оптимизировать код, половину переписал и упростил. Получил ускорение в 10 раз.

В конечном итоге я пробегаю по DataFrame всего за 7 минут. Собираю все признаки (их более 3 млн.).
Проблема сейчас в другом. Я хочу считывать DataFrame построчно и сразу преобразовывать его в разряженную матрицу.
Я читаю строку, парсю её, добавляю столбцы в которых признаки имеют нулевые значения.
Сохраняю все в виде словаря {'cuid': ghgfdfjksdhf, 'Make_Cat_Feature_1': 0, 'Make_Cat_Feature_2: 1 и так далее}. Затем мне надо данный словарь преобразовать в DataFrame. Я делаю это так df = pd.DataFrame(finish).
И вот тут всё останавливается, комп просто умирает преобразовывая словарь в вектор длиной 3 млн. признаков.

Попробую как вы предлагаете, ведь тогда не надо будет преобразовывать словарь в DataFrame.
22.07.2018, 20:05:55
Добрый день!
у меня 4ГБ оперативки, но на AWS можно арендовать хоть 200. Для препроцессинга и пары часов хватит, то есть максимум доллар потратишь.


Зарегистрируйтесь или войдите, чтобы оставить сообщение.