熊猫的记忆问题(了解记忆问题)



问题是我有 299 个.csv文件(每个文件平均 150-200 MB,数百万行和 12 列 - 构成了一年的数据(大约 52 GB/年)。我有 6 年的时间,想最终将它们全部连接起来),我想用 python 将它们连接成一个 .csv 文件。正如您所料,我在尝试以下代码时遇到了内存错误(我的机器有 16GB 的 RAM):

import os, gzip, pandas as pd, time
rootdir = "/home/eriz/Desktop/2012_try/01"
dataframe_total_list = []
counter = 0 
start = time.time()
for subdir, dirs, files in os.walk(rootdir):
dirs.sort()
for files_gz in files:
with gzip.open(os.path.join(subdir, files_gz)) as f:
df = pd.read_csv(f)
dataframe_total_list.append(df)
counter += 1
print(counter)
total_result = pd.concat(dataframe_total_list)
total_result.to_csv("/home/eriz/Desktop/2012_try/01/01.csv", encoding="utf-8", index=False)

我的目标是:获取一个.csv文件,然后用于训练 DL 模型等。

我的限制:我对如此大量的数据非常陌生,但我已经完成了"部分"工作:

  1. 我知道多处理对我的开发没有多大帮助;这是一个顺序的工作,我需要完成每个任务,以便我可以开始下一个任务。主要问题是内存耗尽。

  2. 我知道熊猫可以很好地处理这个问题,即使添加了块大小。但是,内存问题仍然存在,因为数据量很大。

  3. 试图将工作拆分为小任务,以免内存不足,但稍后在连接时无论如何我都会拥有它。

我的问题:

  1. 是否仍然可以以我不知道的任何其他方式使用 python/pandas 完成此任务,或者无论哪种方式都需要切换到数据库方法?你能建议哪个吗?

  2. 如果数据库方法是唯一的路径,那么当需要执行基于 python 的操作来训练 DL 模型时,我会遇到问题吗?我的意思是,如果我需要使用 pandas/numpy 函数来转换数据,这是可能的还是会因为文件大小而出现问题?

提前非常感谢,我将不胜感激对该主题的深入解释。

更新 10/7/2018

在尝试并使用@mdurant指出的以下代码片段后,我学到了很多东西,并纠正了我对dask和内存问题的看法。

课:

  • Dask在第一个预处理任务之后可以使用(如果最终你最终得到巨大的文件并且熊猫难以加载/处理它们)。一旦你有了"想要的"猛犸象文件,你可以毫无问题地将其加载到dask.dataframe对象中并对其进行处理。

  • 内存相关:第一课- 想出一个过程,这样你就不需要连接所有文件并且内存不足;只需通过更改 dtype、删除列、重新采样来处理它们循环和减少其内容......第二课- 尽量只把你需要的东西放在内存中,这样你就不会用完。第三课 - 如果任何其他课程不适用,只需寻找EC2实例,大数据工具,如Spark,SQL等。

感谢@mdurant和@gyx-hh的时间和指导。

第一件事:获取每个CSV的内容并连接成一个巨大的CSV非常简单,您不需要熊猫或其他任何东西(甚至python)

outfile = open('outpath.csv', 'w')
for files_gz in files:
with gzip.open(os.path.join(subdir, files_gz)) as f:
for line in f:
outfile.write(line)
outfile.close()

(如果每个 CSV 的标题带有列名,则可能需要忽略该行的第一行)。

对数据进行处理更难。原因是,尽管 Dask 可以读取所有文件并将集作为单个数据帧处理,但如果任何文件导致内存超过系统可以处理的内存,处理将失败。这是因为随机访问不会与 gzip 压缩混合使用。

但是,输出文件(大概)是未压缩的,因此您可以执行以下操作:

import dask.dataframe as dd
df = dd.read_csv('outpath.csv')  # automatically chunks input
df[filter].groupby(fields).mean().compute()

在这里,只有对dd.compute()的引用特定于 dask。

最新更新