Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.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_Pandas_Dataframe - Fatal编程技术网

Python 创建数据帧时如何预先分配内存

Python 创建数据帧时如何预先分配内存,python,pandas,dataframe,Python,Pandas,Dataframe,在执行作业的过程中,我希望在执行的每个步骤中构建一个带有内部状态的数据帧。我想这样做是因为我希望以后能够使用数据帧进行一些分析。因此,这就是上下文:我从一个空数据帧开始,在作业完成所有数据的生成之后,最终的数据帧大小是7GB(最多) 以下是我迄今为止尝试过的方法: 我可以维护一个列表列表,我的工作会不断在列表中添加新行。最后,我运行了类似这样的操作:df=pd.DataFrame(rows,columns=list(“abc”))。这是最快的方法,但在内存使用方面非常浪费 我不再使用列表列表,而

在执行作业的过程中,我希望在执行的每个步骤中构建一个带有内部状态的数据帧。我想这样做是因为我希望以后能够使用数据帧进行一些分析。因此,这就是上下文:我从一个空数据帧开始,在作业完成所有数据的生成之后,最终的数据帧大小是7GB(最多)

以下是我迄今为止尝试过的方法:

  • 我可以维护一个列表列表,我的工作会不断在列表中添加新行。最后,我运行了类似这样的操作:
    df=pd.DataFrame(rows,columns=list(“abc”))
    。这是最快的方法,但在内存使用方面非常浪费
  • 我不再使用列表列表,而是一直调用
    df=df.append([{“a”:1.0,“b”:1.0,“c”:“hello”}])
    。这一开始是正常的,但随着数据帧的增长,大量的内存复制开始发生,速度变得非常慢
  • 因此,两者都不理想。在我的作业运行之前,我可以估计数据帧的最终大小(老实说,我认为我通常可以精确地匹配大小),因此我想告诉pandas提前分配整个内存(或者至少分配足够大的块以维持一段时间),然后,我想要一个类似于
    df.append
    的方法,它只在预分配内存的末尾添加新行。理想情况下,如果需要的话,它可以足够智能地调整内存大小


    我可能遗漏了一些东西,但我真的找不到一种方法来做到这一点。

    使用方法1,但每次你达到(比如)10000行时,将列表转换为数据帧,将数据帧附加到数据帧列表,并清除列表(通过将其设置为[])。最后,把你的df块列表和pd.concat放在一起。

    你到底为什么需要这样做?现在还不完全清楚为什么不能让df随着实际数据的增加而增长。这不是我在方法(2)中所做的吗?如果不移动数据,df如何增长?那是我的问题。我的工作是一个模拟,目前不使用熊猫。我可以尝试其他解决方案,比如将日志数据写入文件,然后从文件中读取。不过,我希望有一个更简单的架构。方法2有什么问题?保留内存有什么好处?7GB并没有那么大。内存很便宜。另外,如果您使用的是Jupyter,它的内存管理非常糟糕,垃圾收集在那里根本不起作用。最后,pandas中的数据类型大部分是64位的,因此这将快速提高内存使用率。如果可能,指定较低的数据类型,如int或float 32、16或8。这取决于你的数据。@Chris方法2速度非常慢,因为所有的副本(使用该方法模拟需要70分钟,而使用“附加到列表”方法只需要16分钟)之后,我在最后运行了
    pd.concat(dfs).reset_index().drop(columns=“index”)
    。不确定是否有更有效的方法。但这很有效。我的算法现在需要30分钟。并且只使用12GB的RAM:)