我面临一个问题,我必须在一个循环中生成大数据帧(每次两个2000 x 800熊猫数据帧计算50次迭代)。我想将结果保存在一个更大的数据框中,或者保存在类似字典的结构中。 当使用pandas.concat时,在循环中的某个点上会出现内存错误。当使用numpy.append将结果存储在numpy数组的字典中而不是数据帧中时,也会发生同样的情况。在这两种情况下,我仍然有很多可用内存(几GB)。这对熊猫或小企鹅来说是不是太多数据了?有没有更节省内存的方法来存储我的数据而不将其保存在磁盘上?
例如,只要nbIds
大于376,以下脚本就会失败:
import pandas as pd
import numpy as np
nbIds = 376
dataids = range(nbIds)
dataCollection1 = []
dataCollection2 = []
for bs in range(50):
newData1 = pd.DataFrame( np.reshape(np.random.uniform(size =
2000 * len(dataids)),
(2000,len(dataids ))))
dataCollection1.append( newData1 )
newData2 = pd.DataFrame( np.reshape(np.random.uniform(size =
2000 * len(dataids)),
(2000,len(dataids ))))
dataCollection2.append( newData2 )
dataCollection1 = pd.concat(dataCollection1).reset_index(drop = True)
dataCollection2 = pd.concat(dataCollection2).reset_index(drop = True)
当nbIds
大于等于665时,下面的代码失败
import pandas as pd
import numpy as np
nbIds = 665
dataids = range(nbIds)
dataCollection1 = dict( (i , np.array([])) for i in dataids )
dataCollection2 = dict( (i , np.array([])) for i in dataids )
for bs in range(50):
newData1 = np.reshape(np.random.uniform(size = 2000 * len(dataids)),
(2000,len(dataids )))
newData1 = pd.DataFrame(newData1)
newData2 = np.reshape(np.random.uniform(size = 2000 * len(dataids)),
(2000,len(dataids)))
newData2 = pd.DataFrame(newData2)
for i in dataids :
dataCollection1[i] = np.append(dataCollection1[i] ,
np.array(newData1[i]))
dataCollection2[i] = np.append(dataCollection2[i] ,
np.array(newData2[i]))
每次我都需要计算这两个数据帧,并且对于每个元素i
我需要获得一个pandas系列或一个包含为i
生成的50*2000个数字的numpy数组。理想情况下,我需要能够在nbIds
等于或大于800的情况下运行此命令。
有没有直截了当的方法?
我使用32位的Python和Python 2.7.5、pandas 0.12.0和numpy 1.7.1。
非常感谢你的帮助!
正如使用eathstar、Boud和Jeff在评论中所建议的那样,切换到64位python可以做到这一点。
如果精度损失不是问题,那么使用Jeff建议的float32数据类型也会增加在32位环境中可以处理的数据量。
一个简单的(但使用硬盘驱动器)方法是简单地使用shelve(硬盘驱动器dict):http://docs.python.org/2/library/shelve.html
这基本上就是你在做的。请注意,如果在数据帧之前或之后进行转换,则从内存角度看,这并没有多大区别。
但您可以指定dtype='float32'来有效地占用1/2内存。
相关问题 更多 >
编程相关推荐