Python 熊猫的记忆问题(理解记忆问题)
问题是,我有299个.csv文件(每个文件平均150-200 MB,有数百万行和12列,这构成了一年的数据(大约52 GB/年)。我有6年时间,希望最终将所有文件连接起来),我想用python将其连接成一个.csv文件。正如您所料,我在尝试以下代码时遇到内存错误(我的机器有16GB的RAM): 我的目标:获取单个.csv文件,然后用于培训DL模型等 我的限制:我对如此庞大的数据非常陌生,但我已经完成了“部分”工作:Python 熊猫的记忆问题(理解记忆问题),python,database,pandas,memory,deep-learning,Python,Database,Pandas,Memory,Deep Learning,问题是,我有299个.csv文件(每个文件平均150-200 MB,有数百万行和12列,这构成了一年的数据(大约52 GB/年)。我有6年时间,希望最终将所有文件连接起来),我想用python将其连接成一个.csv文件。正如您所料,我在尝试以下代码时遇到内存错误(我的机器有16GB的RAM): 我的目标:获取单个.csv文件,然后用于培训DL模型等 我的限制:我对如此庞大的数据非常陌生,但我已经完成了“部分”工作: 我知道多重处理对我的发展没有多大帮助;这是一项连续的工作,我需要完成每项任务,以
dask
和内存问题的看法
经验教训:
是在第一个预处理任务之后使用的(如果最终您会遇到巨大的文件,而pandas很难加载/处理它们)。一旦您有了“想要的”庞大文件,您就可以将其加载到Dask
对象中,而不会出现任何问题并对其进行处理dask.dataframe
- 内存相关: 第一课-想出一个程序,这样你就不需要压缩所有的文件,你的内存就用完了;只需通过更改数据类型、删除列、重新采样来处理循环和减少内容。。。第二课——试着只把你需要的东西记在记忆中,这样你就不会用完。第三个教训——如果其他任何一个教训都不适用,那就找一个EC2实例,比如Spark、SQL等大数据工具
感谢@mdurant和@gyx hh为您提供的时间和指导 第一件事:将每个CSV的内容合并成一个巨大的CSV非常简单,您不需要熊猫或其他任何东西(甚至python) (如果每个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特有的。看看dask
我以前从未使用过它,但它可能对您的案例有所帮助@gyx hh感谢您的快速更新;我一定会查的。非常感谢您@mdurant的解释。要学的东西很多。我明天会检查所有这些,并在相同的基础上更新。现在出现了一个疑问:如果我按照您的建议逐行处理并创建一个巨大的.csv文件,那么当.csv文件越来越大或者输出文件在磁盘空间而不是RAM中打开时,我是否会遇到同样的内存耗尽问题?这可能是一个无知的问题,但如果你能解决它就好了。另外,如果在处理文件时如您所说“任何文件都会导致内存过剩”,您是否可以提出一个遵循方法的建议?再次谢谢你。对不起,我不明白。如果您的目的是创建一个庞大的文件,请执行上述操作。如果您的目的是作为数据帧进行分析,请加载未压缩文件(如图所示),或者加载gz文件集(如果每个文件足够小)。Dask善于根据需要处理数据块,即使总数不适合内存;这就是dask的作用。好的@mdurant。我将深入了解所有这些,并通过dask文档更好地理解它,如果有任何疑问,请返回并确认答案。谢谢你抽出时间。
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()
import dask.dataframe as dd
df = dd.read_csv('outpath.csv') # automatically chunks input
df[filter].groupby(fields).mean().compute()