Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫的记忆问题(理解记忆问题)_Python_Database_Pandas_Memory_Deep Learning - Fatal编程技术网

Python 熊猫的记忆问题(理解记忆问题)

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模型等 我的限制:我对如此庞大的数据非常陌生,但我已经完成了“部分”工作: 我知道多重处理对我的发展没有多大帮助;这是一项连续的工作,我需要完成每项任务,以

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

我的目标:获取单个.csv文件,然后用于培训DL模型等

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

  • 我知道多重处理对我的发展没有多大帮助;这是一项连续的工作,我需要完成每项任务,以便开始下一项任务。主要问题是内存不足

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

  • 我已经尝试将工作拆分为一些小任务,这样我就不会耗尽内存,但我还是会在以后连接时使用它

  • 我的问题:

  • 在python/pandas中,是否仍然可以以我不知道的任何其他方式执行此任务,或者我是否需要切换到数据库方法?你能告诉我是哪个吗

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

  • 提前非常感谢,我将非常感谢您对本主题的深入解释

    更新日期:2018年10月7日

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

    经验教训:

    • Dask
      是在第一个预处理任务之后使用的(如果最终您会遇到巨大的文件,而pandas很难加载/处理它们)。一旦您有了“想要的”庞大文件,您就可以将其加载到
      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()