В случае необходимости файл, который я использую, можно найти на этой странице; на вкладке «Fichiers» оно должно быть помечено «Sirene : Fichier StockEtablissementHistorique [...]». Сегодня этот файл имеет длину около 37 миллионов строк.
Будучи большим поклонником панд, я, тем не менее, решил попробовать поляры, которые в те дни широко рекламировались.
Выведенный фрейм данных также следует соединить с другим, созданным с помощью pl.read_database (который создает pl.DataFrame и нет pl.LazyFrame).
- Моя первая попытка включала LazyFrame и (наивную) надежду, что scan_csv с аргументом low_memory будет достаточно для обработки потребления оперативной памяти. Мой компьютер полностью завис из-за чрезмерного потребления оперативной памяти.
- Я попробовал еще раз, используя n_rows вместе с Skip_rows_after_header. Но если
работает нормально, pl.read_csv(my_path, n_rows=1_000_000,skip_rows_after_header=30_000_000), похоже, занимает вечность (гораздо больше, чем простой цикл для определения количества строк).
Код: Выделить всё
pl.read_csv(my_path, n_rows=1_000_000) - Я также пробовал pl.read_csv_batched, но кажется также потребуется вечность (возможно, для вычисления тех первых статистических данных, не описанных в документации).
- Единственный способ, который я нашел для полной обработки файла с полярами, - это обрабатывать фрагменты из LazyFrame и собирать их. Примерно так:
Это «решение», кажется, обрабатывает память, но работает очень медленно.
Код: Выделить всё
df = ( pl.scan_csv( url, separator=",", encoding="utf8", infer_schema_length=0, low_memory=True, ) .lazy() .select(pl.col(my_cols) # do some more processing, for instance .filter(pl.col("codePaysEtrangerEtablissement").is_null()) ) chunksize=1_000_000 for k in range(max_iterations:) chunk = df.slice(chunksize*k, chunksize).collect() chunk = chunk.join(my_other_dataframe, ... ) # Do some more things like storing the chunk in a database.
Это настолько хорошо, насколько это возможно, и работает только потому, что (к счастью) в нем не задействована группировка мой процесс.
Я почти уверен, что должен быть более простой «чистый полярный» способ продолжить.
РЕДАКТИРОВАТЬ
Другой фрейм данных, упомянутый здесь (
Код: Выделить всё
my_other_dataframeПодробнее здесь: https://stackoverflow.com/questions/763 ... ilable-ram