首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >熊猫的记忆问题(了解记忆问题)

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

Stack Overflow用户
提问于 2018-07-09 10:29:14
回答 1查看 375关注 0票数 0

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

代码语言:javascript
复制
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: --我对这大量的数据非常陌生,但我已经完成了“部分”工作:

  1. 我知道多重处理对我的开发没有多大帮助;这是一个连续的工作,我需要完成每一项任务,这样我就可以开始下面的任务了。主要问题是内存耗尽。
  2. 我知道熊猫可以很好的处理这个问题,即使增加了块的大小。然而,内存问题仍然存在,因为数据量很大。
  3. 我试着把工作分解成一些小任务,这样我就不会耗尽内存,但是当我连接起来的时候,我还是会有它的。

我的问题:

  1. 是否仍有可能以我不知道的任何其他方式与python/大熊猫一起完成这一任务,或者无论采用什么方法,我都需要切换到数据库方法?你能告诉我哪一个吗?
  2. 如果数据库方法是唯一的路径,那么当需要执行基于python的操作来训练DL模型时,我会遇到问题吗?我的意思是,如果我需要使用熊猫/numpy函数来转换数据,这是可能的还是会因为文件的大小而出现问题呢?

事先非常感谢,我希望能对这个话题作更多的解释。

更新2018年10月7日

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

经验教训:

  • Dask是在第一次预处理任务之后使用的(如果是这样的话,你最终会得到巨大的文件,而熊猫很难加载/处理它们)。一旦您有了“想要的”巨量文件,您就可以将它加载到dask.dataframe对象中,而不会出现任何问题,并对其进行处理。
  • 内存相关:第一课-想出一个过程,这样你就不需要连接所有文件而耗尽内存;只需通过更改dtype、删除列、重采样来处理它们,并减少它们的内容.第二课--试着只把你需要的东西投入到记忆中,这样你就不会耗尽。第三课-如果其他课程不适用,只需寻找一个EC2实例,大数据工具,如火花,SQL等。

谢谢你的时间和指导。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-09 19:45:49

第一件事:把每个CSV的内容和连接成一个巨大的CSV是很简单的,你不需要熊猫或其他任何东西(甚至蟒蛇)。

代码语言:javascript
复制
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压缩混合使用。

但是,输出文件(大概)是未压缩的,因此可以这样做:

代码语言:javascript
复制
import dask.dataframe as dd
df = dd.read_csv('outpath.csv')  # automatically chunks input
df[filter].groupby(fields).mean().compute()

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51243386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档