如何在Python中迭代遍历大型CSV文件时减少内存使用?

3
我目前有一个包含20万行的csv文件,每行包含80个条目,由逗号分隔。我尝试使用open()打开csv文件,并将数据附加到一个二维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])

temp 只在开始时初始化,这正常吗? - Jean-François Fabre
@Jean-FrançoisFabre,您所说的“正常”是什么意思?我只需要这个变量暂时保存80个单独的条目,并将它们转换为一个单一的条目。这就是为什么它只包含在格式数据函数中的原因。 - d3x
1个回答

1

format_data()例程将大量占用您的CPU:

  • 使用子优化方法(StringIO, str.join),而不是string连接。
  • 在整个例程中使用相同的temp变量。
  • 在循环中添加temp(基本上是追加一个越来越大的字符串)。

我想你只是想将每行所有文本作为1个字符串附加,不带空格。使用str.join可以更快地完成,避免字符串连接。

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

甚至更快,如果你能摆脱打印输出:
 concatenate_data = ["".join(batch) for batch in raw_data]

我明白了这一点,因为重复附加相同的数据毫无意义。 - Jean-François Fabre
非常抱歉,我完全忘记将临时变量设置为空字符串。目标是将80个单个字符串附加到一个大字符串中,并对所有200k条目执行此操作。 - d3x
你的意思是concatenate_data是一个连接行的列表,还是一个包含csv文件中所有字符串的巨大字符串? - Jean-François Fabre
我的意思是一个字符列表的串联。因此,将[[a,b,c,d,....],[a,b,c,d,...],.... []]更改为[abcd ...,abdc ...,abcd ...,...] - d3x
非常感谢。我不知道.join比通常的拼接要快很多。这些打印语句只是用来调试的:) - d3x

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接