【问题标题】:Pythonic way to process 200 million element data set?处理 2 亿个元素数据集的 Pythonic 方式?
【发布时间】:2014-05-23 13:38:45
【问题描述】:

我有一个包含 1,000 个文件的目录。每个文件有很多行,每行是一个 4 - 8 个字节的 ngram。我正在尝试解析所有文件以将不同的 ngram 作为标题行,然后对于每个文件,我想写一行,该行具有该 ngram 序列在文件中出现的频率。

以下代码通过收集标头来实现,但在尝试将标头写入 csv 文件时遇到内存错误。我在具有 30GB RAM 的 Amazon EC2 实例上运行它。谁能提供我不知道的优化建议?

#Note: A combination of a list and a set is used to maintain order of metadata
#but still get performance since non-meta headers do not need to maintain order
header_list = []
header_set = set()
header_list.extend(META_LIST)
for ngram_dir in NGRAM_DIRS:
  ngram_files = os.listdir(ngram_dir)
  for ngram_file in ngram_files:      
      with open(ngram_dir+ngram_file, 'r') as file:
        for line in file:
          if not '.' in line and line.rstrip('\n') not in IGNORE_LIST:
            header_set.add(line.rstrip('\n'))

header_list.extend(header_set)#MEMORY ERROR OCCURRED HERE

outfile = open(MODEL_DIR+MODEL_FILE_NAME, 'w')
csvwriter = csv.writer(outfile)
csvwriter.writerow(header_list)

#Convert ngram representations to vector model of frequencies
for ngram_dir in NGRAM_DIRS:
  ngram_files = os.listdir(ngram_dir)
  for ngram_file in ngram_files:      
      with open(ngram_dir+ngram_file, 'r') as file:
        write_list = []
        linecount = 0
        header_dict = collections.OrderedDict.fromkeys(header_set, 0)
        while linecount < META_FIELDS: #META_FIELDS = 3
          line = file.readline()
          write_list.append(line.rstrip('\n'))
          linecount += 1 
        file_counter = collections.Counter(line.rstrip('\n') for line in file)
        header_dict.update(file_counter)
        for value in header_dict.itervalues():
          write_list.append(value)
        csvwriter.writerow(write_list)

outfile.close() 

【问题讨论】:

    标签: python amazon-ec2 large-data-volumes large-data


    【解决方案1】:

    然后不要扩展该列表。使用来自 itertools 的链来链接列表并设置。

    而不是这个:

    header_list.extend(header_set)#MEMORY ERROR OCCURRED HERE
    

    这样做(假设 csvwriter.writerow 接受任何迭代器):

    headers = itertools.chain(header_list, header_set)
    ...
    csvwriter.writerow(headers)
    

    这至少应该避免您当前看到的内存问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-25
      • 2012-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-13
      • 2022-01-13
      相关资源
      最近更新 更多