【问题标题】:Memory error at pythonpython的内存错误
【发布时间】:2014-01-30 18:41:16
【问题描述】:
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 列。所以我正在读取每个单词并将频率和找到平均值..bt 在运行此代码时出现内存错误?我该如何解决?

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...)

【问题讨论】:

  • 所以... 3227 * 60k, = 193,620,000 条记录。你不觉得往内存里塞东西有点多吗?
  • 我也很困惑——for k in range(6,7) 就是k=6
  • 是的,我知道该怎么做?我有这么多数据..
  • 如果您遇到内存错误,您应该使用生成器而不是列表。但是,我对csv.reader 的工作还不够多,无法真正了解您要使用的数据结构。你可以print(CSV_tag_reader[0]) 告诉我它是什么样子的吗?我可以指导您制作一个生成器,对您的字数进行求和和平均。
  • 我会逐行读取 csv 文件,并将其排序为数据库结构。它不适合内存,但您可以使用 dbm 模块创建一个在磁盘上的 dict-looking 对象。

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


【解决方案1】:

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

或者,您可以使用file.seek(),虽然它会很慢。

【讨论】:

    【解决方案2】:

    要查找每列的平均值,无需将整个内容加载到内存中。做类似的事情

    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]
    

    【讨论】:

    • 我想要列的 avgs 大于 0.3 的 hedaer 我该如何提取
    • [h for (h, a) in zip(headers, avgs) if a &gt; 0.3]
    • 我更新了代码,它现在读取第一行 CSV 作为标签,并在最后一行找到相关的
    • @rmartinjak 我可以使用此代码找到列中非零值的数量吗?
    猜你喜欢
    • 1970-01-01
    • 2019-06-14
    • 2012-07-02
    • 2013-12-04
    • 2012-10-31
    • 2011-05-18
    • 1970-01-01
    • 2019-11-16
    • 2018-04-29
    相关资源
    最近更新 更多