繁体   English   中英

如何在python中迭代大型CSV文件时轻松获取内存?

[英]How to go easy on memory while iterating through a large CSV file in python?

我目前有一个200k行的csv文件,每行包含80个条目,用逗号分隔。 我尝试用open()打开csv文件,并将数据附加到2-D python列表中。 当我尝试遍历该列表并将80个条目附加到单个列表时,计算机会冻结。 我的代码是否会产生某种内存问题? 我应该批量处理我的数据还是有更有效的方法来完成我想要做的事情?

简而言之:打开csv,通过200k条目并从[1,2,3,4,5,...,80],[1,...,80],...... 200k转换它们 - > [ 12345 ... 80]。 [1 ... 80],200k

import csv


# create empty shells
raw_data = []
concatenate_data = []


def get_data():
    counter = 1

    # open the raw data file and put it into a list
    with open('raw_data_train.csv', 'r') as file:
        reader = csv.reader(file, dialect='excel')

        for row in reader:
            print('\rCurrent item: {0}'.format(counter), end='', flush=True)
            raw_data.append(row)
            counter += 1

    print('\nReading done')


def format_data():
    counter = 1
    temp = ''

    # concatenate the separated letters for each string in the csv file
    for batch in raw_data:
        for letters in batch:
            temp += letters
        concatenate_data.append(temp)
        print('\rCurrent item: {0}'.format(counter), end='', flush=True)
        counter += 1

    print('\nTransforming done')
    print(concatenate_data[0:10])

format_data()例程必然会占用你的CPU很多:

  • 使用string连接,这是次优的而不是其他方法( StringIOstr.join
  • 在整个例程中使用相同的temp变量
  • 在循环中附加temp (基本上附加一个越来越大的字符串)。

我想你只想这样做:将每行的所有文本附加为1个字符串,不加空格。 使用str.join避免字符串连接要快得多:

for batch in raw_data:
    concatenate_data.append("".join(batch))

如果你可以摆脱印刷品,甚至更快:

 concatenate_data = ["".join(batch) for batch in raw_data]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM