加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

在Python中循环使用大文件需要数小时

发布时间:2020-12-20 12:21:44 所属栏目:Python 来源:网络整理
导读:这是我在 Python工作的第二天.我在C上工作了一段时间,但决定尝试Python.我的程序按预期工作.但是,当我在没有glob循环的情况下一次处理一个文件时,每个文件大约需要半个小时.当我包含glob时,循环大约需要12个小时来处理8个文件. 我的问题是,我的程序中有什么
这是我在 Python工作的第二天.我在C上工作了一段时间,但决定尝试Python.我的程序按预期工作.但是,当我在没有glob循环的情况下一次处理一个文件时,每个文件大约需要半个小时.当我包含glob时,循环大约需要12个小时来处理8个文件.

我的问题是,我的程序中有什么东西肯定会减慢它的速度吗?有什么我应该做的让它更快?

我有一个大文件夹.例如

file1.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()

UPDATE
每个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]

UPDATE2
我已经在f中使用for file运行了两次不同的代码.我第一次在glob.glob(“/ media / 3tb / file.txt”)中运行没有文件名的单个文件:手动编码一个文件的文件路径花了大约30分钟.

我在glob.glob(“/ media / 3tb / * file.txt”)中使用for filename再次运行它,并且文件夹中的一个文件花了一个小时. glob代码是否增加了那么多时间?

解决方法

这里:

for line in f.readlines():

你应该这样做:

for line in f:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读