问题是,我有299个.csv文件(每个文件有1500-200MB,平均有数百万行和12列),这构成了一年的数据(大约52 GB/年)。我有6年的时间,并且想最终将所有这些连接起来),我想将这些连接到一个与python一起的.csv文件中。如您所料,我在尝试以下代码时遇到内存错误(我的机器有16 of的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模型等等。
My constraint: --我对这大量的数据非常陌生,但我已经完成了“部分”工作:
我的问题:
事先非常感谢,我希望能对这个话题作更多的解释。
更新2018年10月7日
在尝试并使用了@mdurant指出的以下代码片段之后,我学到了很多,并纠正了我对dask和内存问题的看法。
经验教训:
Dask是在第一次预处理任务之后使用的(如果是这样的话,你最终会得到巨大的文件,而熊猫很难加载/处理它们)。一旦您有了“想要的”巨量文件,您就可以将它加载到dask.dataframe对象中,而不会出现任何问题,并对其进行处理。谢谢你的时间和指导。
发布于 2018-07-09 19:45:49
第一件事:把每个CSV的内容和连接成一个巨大的CSV是很简单的,你不需要熊猫或其他任何东西(甚至蟒蛇)。
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的。
https://stackoverflow.com/questions/51243386
复制相似问题