python - 在 Python 中循环遍历大文件需要数小时

标签 python performance glob

这是我在 Python 中工作的第二天。我在 C++ 中工作了一段时间,但决定尝试 Python。我的程序按预期工作。但是,当我在没有 glob 循环的情况下一次处理一个文件时,每个文件大约需要半小时。当我包含 glob 时,循环大约需要 12 个小时来处理 8 个文件。

我的问题是,我的程序中是否有任何东西确实会减慢它的速度?我应该做些什么来让它更快?

我有一个大文件文件夹。例如

文件 1.txt (6gb) file2.txt (5.5gb) file3.txt (6gb)

如果有帮助,每行数据都以一个字符开头,告诉我其余字符的格式,这就是为什么我有所有 if elif 语句。一行数据看起来像这样: T35201 M352 RZNGA AC

我正在尝试读取每个文件,使用拆分进行一些解析,然后保存文件。

电脑有32gb的ram,所以我的方法是将每个文件读入ram,然后循环遍历文件,然后保存,为下一个文件清空ram。

我已经包含了该文件,以便您可以看到我正在使用的方法。我使用了一个 if elif 语句,它使用了大约 10 个不同的 elif 命令。我试过一本字典,但我想不出来救我的命。

任何答案都会有所帮助。

import csv
import glob

for filename in glob.glob("/media/3tb/5may/*.txt"):
    f = open(filename,'r')
    c = csv.writer(open(filename + '.csv','wb'))

    second=0
    mill=0
    for line in f.readlines():
       #print line
        event=0
        ticker=0
        marketCategory=0
        variable = line[0:1]    

        if variable is 'T':
           second = line[1:6]
           mill=0
        else: 
           second = second 

        if variable is 'R':
           ticker = line[1:7]   
           marketCategory = line[7:8]
        elif variable is ...
        elif variable is ...
        elif ...
        elif ...
        elif ...
        elif ...
        elif        

        if variable (!= 'T') and (!= 'M')
            c.writerow([second,mill,event ....]) 
   f.close()

更新 每个 elif 语句几乎相同。唯一改变的部分是我分割线条的方式。这里有两条elif语句(一共13条,除了拆分的方式不同,其他几乎一模一样。)

  elif variable is 'C':
     order = line[1:10]
     Shares = line[10:16]
     match = line[16:25]
     printable = line[25:26]
     price = line[26:36]
   elif variable is 'P':
     ticker = line[17:23]
     order = line[1:10]
     buy = line[10:11]
     shares = line[11:17]
     price = line[23:33]
     match = line[33:42]

更新2 我已经两次使用 for file in f 运行代码。我第一次运行单个文件 without for filename in glob.glob("/media/3tb/file.txt"): 手动编码花了大约 30 分钟一个文件的文件路径。

我用 for filename in glob.glob("/media/3tb/*file.txt") 再次运行它,仅一个文件就花了一个小时在文件夹中。 glob 代码会增加那么多时间吗?

最佳答案

这里:

for line in f.readlines():

你应该这样做:

for line in f:

前者将整个文件读入行列表,然后遍历该列表。后者以增量方式执行,这应该会大大减少程序分配和稍后释放的总内存。

关于python - 在 Python 中循环遍历大文件需要数小时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15025919/

相关文章:

php - WordPress php glob();不工作?

python - 使用 python-docx,如何关联 XML 命名空间前缀?

python - Tkinter 中的滚动进度条

python - 正则表达式结果

python - 全局排除模式

PHP array_walk什么都不做?

python - 当 DEBUG 为 False 时,使用 Django 的(非网络)脚本是否需要 django.db.reset_queries?

SQL INNER JOIN 与 Where Exists 性能考虑

javascript - React + Redux 性能优化与 componentShouldUpdate

javascript - 改进 Angular 中的 ng-repeat(只读 html 表格)渲染性能