处理2亿元素数据集的Python方式?

处理2亿元素数据集的Python方式?,python,amazon-ec2,large-data-volumes,large-data,Python,Amazon Ec2,Large Data Volumes,Large Data,我有1000个文件的目录。每个文件都有许多行,其中每行是一个4-8字节不等的ngram。我试图解析所有文件,以获得不同的ngram作为标题行,然后对于每个文件,我想写一行,该行具有文件中出现的ngram序列的频率 下面的代码完成了标题的收集,但在尝试将标题写入csv文件时遇到了内存错误。我在一个AmazonEC2实例上用30GB的RAM运行它。有人能提供我不知道的优化建议吗 #Note: A combination of a list and a set is used to maintain

我有1000个文件的目录。每个文件都有许多行,其中每行是一个4-8字节不等的ngram。我试图解析所有文件,以获得不同的ngram作为标题行,然后对于每个文件,我想写一行,该行具有文件中出现的ngram序列的频率

下面的代码完成了标题的收集,但在尝试将标题写入csv文件时遇到了内存错误。我在一个AmazonEC2实例上用30GB的RAM运行它。有人能提供我不知道的优化建议吗

#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() 
#注意:列表和集合的组合用于维护元数据的顺序
#但仍然可以获得性能,因为非元头不需要维护顺序
标题列表=[]
标题_set=set()
标题列表。扩展(元列表)
对于ngram_目录中的ngram_目录:
ngram_files=os.listdir(ngram_dir)
对于ngram_文件中的ngram_文件:
打开(ngram_dir+ngram_file,'r')作为文件:
对于文件中的行:
如果第行中没有“.”并且第.rstrip(“\n”)行不在忽略列表中:
标题\u set.add(行.rstrip('\n'))
header_list.extend(header_set)#此处发生内存错误
outfile=open(模型目录+模型文件名'w')
csvwriter=csv.writer(输出文件)
csvwriter.writerow(标题列表)
#将ngram表示转换为频率矢量模型
对于ngram_目录中的ngram_目录:
ngram_files=os.listdir(ngram_dir)
对于ngram_文件中的ngram_文件:
打开(ngram_dir+ngram_file,'r')作为文件:
写入列表=[]
行数=0
header\u dict=collections.OrderedDict.fromkeys(header\u set,0)
而linecount
那就不要扩展这个列表。使用itertools中的链来链接列表并设置

与此相反:

header_list.extend(header_set)#MEMORY ERROR OCCURRED HERE
执行此操作(假设csvwriter.writerow接受任何迭代器):

这至少可以避免您当前看到的内存问题

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