python中的内存错误

时间:2014-01-30 18:41:16

标签: python python-2.7 python-3.x

from __future__ import division
import dataProcess
import csv,re
from collections import OrderedDict
import itertools
#######################################################################################
#                   Pruning of N-grams depending upon the frequency of tags           #                                                       
#######################################################################################

for k in range(2,8):
    filename="Dataset/Cross/N_gram_Features_Pruned/"+str(k)+"_gram.txt"
    filewrite=open(filename,"w")
    CSV_tag_reader=csv.reader(open("Dataset/Cross/N_grams_recored/"+str(k)+"_gram.csv","r"),delimiter=',')
    header_data=CSV_tag_reader.next();    
    table = [row for row in CSV_tag_reader]
    values=[]
    result_tag=[]
    for j in range(0,len(header_data)):
        sum1=0
        avg1=0
        for i in range (0,3227):
            sum1=sum1+int(table[i][j])
    ##    print "************************************************************"
    ##    print sum1
        avg1=sum1/3227
    ##    print avg1
        if(avg1>=0.3):
            result_tag.append(header_data[j])
    print len(header_data)
    print len(result_tag)
    print "************************************************************"
    filewrite.write(str(result_tag))

我的代码是计算3227个数据样本中特定单词的频率。我在3227个样本中记录了大约277436个单词的频率。所以图像csv文件有3227行和60k列。所以我正在读取每个单词并将频率和找到平均值...运行此代码时出现内存错误?我该如何解决?

Error:
Traceback (most recent call last):
  File "N_gram_pruning.py", line 15, in <module>
    table = [row for row in CSV_tag_reader]
MemoryError

我的csv文件就像thisss

f1 f2 f3  f4.....f277436(header row)
0  9  1    4      70
56 2  66   8      23
(3227 rows...)

2 个答案:

答案 0 :(得分:1)

问题是你正在将整个文件读入内存。为避免这种情况,您可能需要重新构建算法。您似乎单独操作每个列,这意味着每列上的操作都是独立的。因此,如果您转换csv文件以便逐行读取它们,则可以迭代这些行而不是将它们全部读入内存。

或者,您可以使用file.seek(),但它会非常慢。

答案 1 :(得分:0)

要查找每列的平均值,不需要将整个内容加载到内存中。做点什么

with open(filename) as f:
    csvreader = csv.reader(f)
    tags = next(csvreader)
    sums = [0] * len(tags)
    for count, row in enumerate(csvreader, 1):
        sums = [x + y for x, y in zip(sums, row)]
avgs = [x / count for x in sums]
result_tags = [h for (h, a) in zip(tags, avgs) if a > 0.3]