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...)
答案 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]