wrpython 发表于 2022-1-23 16:17:40

为什么程序运行完了还会占用将近30%的CPU?

本帖最后由 wrpython 于 2022-1-23 16:22 编辑

大家好,
我写了一段很简单的代码,作用是从一个不断更新的数据文本里读取包含特定信息的数据,代码如下
f2 = open('GRAY.NQ.txt','w')
with open('TOS_2.log') as f1:
    while True:
      for line in f1:
            tos = line.strip().split(',')
            symbol = tos
            if symbol == 'GRAY.NQ':
                print(line)
                f2.writelines(line)
    f2.close()

log文件太大,不方便放上来。
代码可以正常跑,但即使读完了整个文本,这段代码还是会占用大量CPU资源



因为实际工作中还需要同时打开其他软件,这导致电脑一直很卡。
处理器是这个型号:AMD Athlon(tm) X4 740 Quad Core Processor3.20 GHz

我觉得一段这么简单的代码不应该会占用这么多的CPU资源,请问这段代码应该如何改进?

isdkz 发表于 2022-1-23 16:33:15

本帖最后由 isdkz 于 2022-1-23 16:44 编辑

用time.sleep休眠一定的时间,你这死循环不阻塞地跑个不停占用CPU肯定高呀,还有你的关闭文件在死循环外跑久一点占用内存也挺大的
import time
time.sleep(0.2)

wrpython 发表于 2022-1-23 22:54:54

isdkz 发表于 2022-1-23 16:33
用time.sleep休眠一定的时间,你这死循环不阻塞地跑个不停占用CPU肯定高呀,还有你的关闭文件在死循环外跑 ...

谢谢,没想到这么简单就解决了,CPU占用一下没有了。

另外请问一下文件关闭了怎么还会有内存占用?

我这段代码一开一般就会开一上午或者一下午,暂时还没有注意到内存占用太多。如果以后有这个问题,该怎么解决?

不好意思,我不是专门的程序员,只是为了工作方便,学了一点python的皮毛就没学了。问的问题可能比较低级,还请见谅.

isdkz 发表于 2022-1-23 23:26:53

本帖最后由 isdkz 于 2022-1-23 23:32 编辑

wrpython 发表于 2022-1-23 22:54
谢谢,没想到这么简单就解决了,CPU占用一下没有了。

另外请问一下文件关闭了怎么还会有内存占用?


你的close()在死循环外呀,你这死循环就没跳出过,也就是一旦运行你的文件就没关闭过,就是那个用来写的文件,
你在还没有关闭的时候写入的内容是不会存到磁盘的,你可以测试一下不关闭的时候打开那个文件看看内容有没有改变,
那不写到磁盘里面那是在哪呢?其实它是暂存在了内存里,
只有当你close()的时候才存到磁盘,
你一直不关闭的话,程序运行久了,写的内容多了自然占的内存就会高了

1449620085 发表于 2022-1-24 15:09:16

{:10_256:}

qwb1997 发表于 2022-1-24 15:20:59

{:10_266:}

fxj2002 发表于 2022-1-24 16:04:23

{:5_109:}

Аdmin 发表于 2022-1-24 16:17:21

不知道

qwb1997 发表于 2022-1-24 16:42:29

{:10_279:}

1molHF 发表于 2022-1-24 19:47:26

{:10_254:}

wrpython 发表于 2022-1-24 21:19:25

isdkz 发表于 2022-1-23 23:26
你的close()在死循环外呀,你这死循环就没跳出过,也就是一旦运行你的文件就没关闭过,就是那个用来写 ...

谢谢,我今天在公司改了代码,CPU占用的问题解决了,但是出现了一个新问题,读取的速度变得很慢,比如说log文件里的数据是现在更新的,但是读取会在3分钟之后才读取到,随着时间推移,甚至会出现读取慢半小时的情况。

我没找到原因,但是估计应该是因为我每次循环后都让代码休眠了,我设想的情况是只有在log文件更新后才进行读取,所以增加了一个条件语句,判定当前行是否为空,如果为空的话,就让程序休眠,如果不为空,就正常运行,代码如下:
f2 = open('GRAY.NQ.txt','w')
with open('TOS_2.log') as f1:
    while True:
      for line in f1:
            if line == ' ' :
                time.sleep(0.05)
            else :
                tos = line.strip().split(',')
                symbol = tos
                if symbol == 'GRAY.NQ':
                  print(line)
                  f2.writelines(line)
    f2.close()

这样改了之后读取倒是没有了言辞,但是CPU占用又上来了......按理说这样应该就不会让循环一直执行啊,为什么CPU占用还是这么高?能否麻烦你再指点一下,谢谢

isdkz 发表于 2022-1-24 21:58:03

本帖最后由 isdkz 于 2022-1-24 22:35 编辑

wrpython 发表于 2022-1-24 21:19
谢谢,我今天在公司改了代码,CPU占用的问题解决了,但是出现了一个新问题,读取的速度变得很慢,比如说l ...

你先试试这个

from time import sleep

with open('TOS_2.log') as f1:
    while True:
      if line := f1.readline():
                with open('GRAY.NQ.txt','a') as f2:
                  tos = line.strip().split(',')
                  symbol = tos
                  if symbol == 'GRAY.NQ':
                        print(line)
                        f2.writelines(line)
      sleep(0.2)

isdkz 发表于 2022-1-24 22:05:48

wrpython 发表于 2022-1-24 21:19
谢谢,我今天在公司改了代码,CPU占用的问题解决了,但是出现了一个新问题,读取的速度变得很慢,比如说l ...

你是根据什么来判断它有没有读取到的,
如果你是看 'GRAY.NQ.txt' 这个文件的内容的话,
按理说你没有关闭它里面的内容就一直不更新的,
你加的那个条件几乎没有成立的时候,因为还有内容的话都会有个换行符,
没有内容就是空字符串,不是空格

wrpython 发表于 2022-1-24 22:32:52

isdkz 发表于 2022-1-24 22:05
你是根据什么来判断它有没有读取到的,
如果你是看 'GRAY.NQ.txt' 这个文件的内容的话,
按理说你没有 ...

谢谢,实际上工作的时候还为这个程序写了一个tkiner的界面,读取到的内容都会显示到那个界面上,不过我觉得那个界面应该影响不大,所以就没有贴代码。我判断它有没有读取到就是看特定的内容是不是及时出现在了那个界面上.

wrpython 发表于 2022-1-25 13:21:52

我发现如果log文件不实时更新的话,按照我写的代码,python程序是可以正常读取数据且不占用太多CPU的,但是如果log文件一直在不断更新,那么我的代码就会一直占用很高的CPU,我再研究研究~

Passepartout 发表于 2022-1-25 13:35:20

{:5_109:}

qwb1997 发表于 2022-1-25 18:04:20

{:10_266:}

ckblt 发表于 2022-1-25 19:34:48

{:7_139:}

qwb1997 发表于 2022-1-26 09:09:13

{:10_254:}

ohhohh 发表于 2022-1-26 14:47:47

{:10_254:}
页: [1] 2
查看完整版本: 为什么程序运行完了还会占用将近30%的CPU?