Мой совет - переключиться на Dask или Spark .
Если вы хотите продолжить использовать панд, попробуйте следующие советы, чтобы прочитать файл CSV, с pandas.read_csv :
chunksize
параметр: тотпозволяет читать часть файлов одновременно. Например, в вашем случае вы можете использовать размер чанка, равный миллиону, вы получите 90 чанков и сможете работать с каждым чанком отдельно. dtype
параметр: с помощью этого параметра вы можете указать тип данных каждогостолбец просто, передав словарь, как это: {‘a’: np.float32, ‘b’: np.int32, ‘c’: ‘Int32’}
Панды могут использовать 64-разрядные типы данных, в то время как 32-разрядных может быть достаточно для вас. С помощью этого трюка вы могли бы сэкономить 50% пространства.
Практический пример
Попробуйте этот код:
df_chunks = pd.read_csv('test.csv', chunksize=1000000, iterator=True,
parse_dates=['timestamp'], error_bad_lines=False,
dtype={"ordinal":'int32', "latitude": 'float32', "longitude":'float32'})
for chunk in df_chunks:
# chunk = chunk.apply(...) # process the single chunk
for day in ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']:
day_df = chunk.loc[chunk['day_of_week'] == day]
day_df.to_csv(f'{day}.csv', mode='a', index=0, header=False)
Таким образом, вы работаете с одним чанкомданных за один раз и никогда не работать со всеми данными вместе. mode='a'
указывает пандам на добавление.
Примечание 1 : вам не нужно pandas.concat
здесь. Единственное, что делает iterator и chunksize=1000000
, это предоставить вам объект считывателя, который выполняет итерацию 1000000 строк, вместо чтения всего объекта. Используя concat, вы теряете все преимущества использования итераторов и загрузки всего файла в память, точно так же, как при использовании законов csv без указания размера фрагмента.
Note2 : если 'MemoryError'
ошибка сохраняется, попробуйте меньший размер.