Я пытаюсь проиндексировать и сохранить большие CSV-файлы, которые не могут быть загружены в память.Мой код для загрузки CSV, выполнения вычислений и индексации по новым значениям работает без проблем.Упрощенная версия:
cluster = LocalCluster(n_workers=6, threads_per_worker=1)
client = Client(cluster, memory_limit='1GB')
df = dd.read_csv(filepath, header=None, sep=' ', blocksize=25e7)
df['new_col'] = df.map_partitions(lambda x: some_function(x))
df = df.set_index(df.new_col, sorted=False)
Однако, когда я использую большие файлы (например,> 15 ГБ), я сталкиваюсь с ошибкой памяти при сохранении в dataframe в csv с:
df.to_csv(os.path.join(save_dir, filename+'_*.csv'), index=False, chunksize=1000000)
Iпопытался установить chunksize=1000000
, чтобы увидеть, поможет ли это, но это не помогло.
Полная трассировка стека:
Traceback (most recent call last):
File "/home/david/data/pointframes/examples/dask_z-order.py", line 44, in <module>
calc_zorder(fp, save_dir)
File "/home/david/data/pointframes/examples/dask_z-order.py", line 31, in calc_zorder
df.to_csv(os.path.join(save_dir, filename+'_*.csv'), index=False, chunksize=1000000)
File "/usr/local/lib/python2.7/dist-packages/dask/dataframe/core.py", line 1159, in to_csv
return to_csv(self, filename, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/dask/dataframe/io/csv.py", line 654, in to_csv
delayed(values).compute(scheduler=scheduler)
File "/usr/local/lib/python2.7/dist-packages/dask/base.py", line 156, in compute
(result,) = compute(self, traverse=False, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/dask/base.py", line 398, in compute
results = schedule(dsk, keys, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/dask/threaded.py", line 76, in get
pack_exception=pack_exception, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/dask/local.py", line 459, in get_async
raise_exception(exc, tb)
File "/usr/local/lib/python2.7/dist-packages/dask/local.py", line 230, in execute_task
result = _execute_task(task, data)
File "/usr/local/lib/python2.7/dist-packages/dask/core.py", line 118, in _execute_task
args2 = [_execute_task(a, cache) for a in args]
File "/usr/local/lib/python2.7/dist-packages/dask/core.py", line 119, in _execute_task
return func(*args2)
File "/usr/local/lib/python2.7/dist-packages/dask/dataframe/shuffle.py", line 426, in collect
res = p.get(part)
File "/usr/local/lib/python2.7/dist-packages/partd/core.py", line 73, in get
return self.get([keys], **kwargs)[0]
File "/usr/local/lib/python2.7/dist-packages/partd/core.py", line 79, in get
return self._get(keys, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/partd/encode.py", line 30, in _get
for chunk in raw]
File "/usr/local/lib/python2.7/dist-packages/partd/pandas.py", line 175, in deserialize
for (h, b) in zip(headers[2:], bytes[2:])]
File "/usr/local/lib/python2.7/dist-packages/partd/pandas.py", line 136, in block_from_header_bytes
copy=True).reshape(shape)
File "/usr/local/lib/python2.7/dist-packages/partd/numpy.py", line 126, in deserialize
result = result.copy()
MemoryError
Я выполняю dask v1.1.0
в системе Ubuntu 18.04
в python 2.7
.Память моего компьютера составляет 32 ГБ.Этот код работает, как ожидается, с небольшими файлами, которые в любом случае могут помещаться в память, но не с большими.Я что-то упускаю здесь?