Мне нужно разделить файл размером несколько ГБ, в который я собираюсь добавить дополнительные функции ML (добавление функций опережения и задержки). Без разделения файла у меня заканчивается оперативная память, даже в ленивом режиме.
Данные сортируются по первому столбцу, который представляет собой столбец id, который всегда содержит 13 последовательных записей одного и того же значения. Важно избегать разделения группы идентификаторов на отдельные файлы. Это означает, что мы могли бы разбить файл на каждую 13-ю, 26-ю, 39-ю (и т. д.) позицию и сохранить всю группу идентификаторов.
В идеале я бы хотел, чтобы размер каждого файла составлял ~100 МБ. Фактический df.shape равен (5965869, 193), и если предположить, что каждый столбец имеет размер 8 байт, это означает, что мне нужно будет разделить его на файлы примерно по 5000*13 строк.
Я мог бы получить первый фрагмент, используя df.limit(5000*13), но я не уверен, как действовать дальше. Я также не знаю, как мне поступить в потенциальном случае, когда каждый файл будет содержать N строк, но последний файл содержит меньше строк, поскольку общее количество строк может не делиться поровну на N, а оставить остаток.
Ниже приведен минимальный пример: 1320 = 260 строк. Как я мог разделить это на 3 файла, где первые два файла имеют по 138 строк каждый, а последний занимает оставшиеся 13*4 строки?
import polars as pl
import numpy as np
df = pl.DataFrame({"id":13*list(range(20)), "value":np.arange(13*20)}).sort(by="id")
ldf = df.lazy()
# Either via groupby somehow
ldf.group_by("id")...gather(...) # how to do this in a loop?
# or by reading the file in multiples of 13 rows
ldf...gather_in_row_chunks(chunksize=some_multiple_of_13)
Подробнее здесь: https://stackoverflow.com/questions/729 ... ole-groups