2015-10-12 64 views
-2

我正在编写一个模块来训练大型数据集上的ML模型 - 它包含0.6M数据点,每个数据点均为0.15M维度。我面临加载数据集本身的问题。 (所有numpy的阵列)Python +不断增加的内存分配

下面的代码片段(此复制的实际代码的主要行为):

import numpy 
import psutil 

FV_length = 150000 
X_List = [] 
Y_List = [] 

for i in range(0,600000): 
    feature_vector = numpy.zeros((FV_length),dtype=numpy.int) 
    # using db data, mark the features to activated 
    class_label = 0 
    X_List.append(feature_vector) 
    Y_List.append(class_label) 

    if (i%100 == 0): 
     print(i) 
     print("Virtual mem %s" %(psutil.virtual_memory().percent)) 
     print("CPU usage %s" %psutil.cpu_percent()) 

X_Data = np.asarray(X_List) 
Y_Data = np.asarray(Y_List) 

的代码会导致不断增加的内存分配,直到它被杀死。有没有办法减少不断增加的内存分配

我已经尝试过使用gc.collect(),但它总是返回0.我已经使变量=无显式,不再使用。

+6

你期望什么行为?每当您绕过循环并将其存储在列表中时,都会创建一个长度为FV_length的新向量。这将导致增加内存分配。在循环结束时,您期望的内存总量分配是多少? – Conor

+0

@Conor:我使用PyBrain来训练一个神经网络。我的特征向量是0.15米的尺寸。我知道我正在创建新的矢量并将它们添加到迭代列表中,因此增加了内存分配。我在AWS 8GB机器上运行此代码。我想了解是否有更好的方法来编写此代码? –

+0

您正试图在存储器中同时存储900亿英镑。显然,这不适合8GB的内存。我不知道你期望的答案是什么,因为我们对你的要求一无所知。 – interjay

回答

1

正如评论中指出的那样,这里的数据量非常大,即使您设法加载训练集,神经网络也可能会很困难。对你来说最好的选择可能是寻找一些减少你的数据点的方法。像主成分分析这样的东西可以帮助将150K尺寸降低到更合理的数量。

+0

如果在训练期间使用批次和适当的格式(lmdb),神经网络可以正常工作。 –

-1

这就是我为类似的问题所做的。当它被覆盖时,我总是再次创建空列表。

#initialize 

X_List = [] 
Y_List = [] 


//do something with the list 

现在,如果你不需要的旧值,只需创建列表中再次

X_List = [] 
Y_List = [] 

但如果这是你的情况需要或可能我不知道。也许它是最习惯的方式,但它的工作。

+0

也许它不回答这个问题? – mpromonet