【发布时间】:2013-11-04 15:18:54
【问题描述】:
我面临一个问题,我必须在循环中生成大型 DataFrame(每次两个 2000 x 800 pandas DataFrame 计算 50 次迭代)。我想将结果保存在内存中更大的 DataFrame 或类似结构的字典中。 使用 pandas.concat 时,我在循环中的某个位置出现内存错误。当使用 numpy.append 将结果存储在 numpy 数组字典而不是 DataFrame 中时,也会发生同样的情况。在这两种情况下,我仍然有很多可用内存(几 GB)。对于 pandas 或 numpy 来说,处理的数据太多了吗?有没有更节省内存的方法来存储我的数据而不将其保存在磁盘上?
例如,只要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]))
我确实需要每次都计算两个 DataFrame,对于 dataids 的每个元素 i,我需要获取一个 pandas 系列或一个包含为 i 生成的 50 * 2000 个数字的 numpy 数组。理想情况下,我需要能够在 nbIds 等于 800 或更多的情况下运行它。
有没有一种简单的方法可以做到这一点?
我在 Python 2.7.5、pandas 0.12.0 和 numpy 1.7.1 中使用 32 位 Python。
非常感谢您的帮助!
【问题讨论】:
-
你能准确地说它失败时使用了多少内存吗?可能是32位版本的原因?
-
使用第一种方法(使用
pandas.concat),进程在失败时使用 638 MB。使用第二种方法(将数据存储在 numpy 数组的字典中),进程在失败前达到 1.113 GB 的内存使用量。 -
如果您的环境允许,请在 64 位 Python 上使用 pandas
-
上面的代码确实在 Python 64bit 上运行良好。但是我需要让它适用于 Python 32,因为我需要它可以移植到 32 位系统。
标签: python python-2.7 numpy pandas