鱼C论坛

 找回密码
 立即注册
查看: 3594|回复: 21

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

[复制链接]
发表于 2022-1-23 16:17:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 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[0]
            if symbol == 'GRAY.NQ':
                print(line)
                f2.writelines(line)
    f2.close()

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

依然占用31%的CPU

依然占用31%的CPU


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

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

最佳答案
2022-1-23 16:33:15
本帖最后由 isdkz 于 2022-1-23 16:44 编辑

用time.sleep休眠一定的时间,你这死循环不阻塞地跑个不停占用CPU肯定高呀,还有你的关闭文件在死循环外跑久一点占用内存也挺大的
import time
time.sleep(0.2)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-23 16:33:15 | 显示全部楼层    本楼为最佳答案   

回帖奖励 +1 鱼币

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

用time.sleep休眠一定的时间,你这死循环不阻塞地跑个不停占用CPU肯定高呀,还有你的关闭文件在死循环外跑久一点占用内存也挺大的
import time
time.sleep(0.2)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

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

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

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

不好意思,我不是专门的程序员,只是为了工作方便,学了一点python的皮毛就没学了。问的问题可能比较低级,还请见谅.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-23 23:26:53 | 显示全部楼层
本帖最后由 isdkz 于 2022-1-23 23:32 编辑
wrpython 发表于 2022-1-23 22:54
谢谢,没想到这么简单就解决了,CPU占用一下没有了。

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


你的close()在死循环外呀,你这死循环就没跳出过,也就是一旦运行你的文件就没关闭过,就是那个用来写的文件,
你在还没有关闭的时候写入的内容是不会存到磁盘的,你可以测试一下不关闭的时候打开那个文件看看内容有没有改变,
那不写到磁盘里面那是在哪呢?其实它是暂存在了内存里,
只有当你close()的时候才存到磁盘,
你一直不关闭的话,程序运行久了,写的内容多了自然占的内存就会高了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-24 15:09:16 | 显示全部楼层

回帖奖励 +1 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-24 15:20:59 | 显示全部楼层

回帖奖励 +1 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-24 16:04:23 | 显示全部楼层

回帖奖励 +1 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-24 16:17:21 | 显示全部楼层

回帖奖励 +1 鱼币

不知道
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-24 16:42:29 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-24 19:47:26 | 显示全部楼层

回帖奖励 +1 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 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[0]
                if symbol == 'GRAY.NQ':
                    print(line)
                    f2.writelines(line)
    f2.close()

这样改了之后读取倒是没有了言辞,但是CPU占用又上来了......按理说这样应该就不会让循环一直执行啊,为什么CPU占用还是这么高?能否麻烦你再指点一下,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[0]
                    if symbol == 'GRAY.NQ':
                        print(line)
                        f2.writelines(line)
        sleep(0.2)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

你是根据什么来判断它有没有读取到的,
如果你是看 'GRAY.NQ.txt' 这个文件的内容的话,
按理说你没有关闭它里面的内容就一直不更新的,
你加的那个条件几乎没有成立的时候,因为还有内容的话都会有个换行符,
没有内容就是空字符串,不是空格
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

谢谢,实际上工作的时候还为这个程序写了一个tkiner的界面,读取到的内容都会显示到那个界面上,不过我觉得那个界面应该影响不大,所以就没有贴代码。我判断它有没有读取到就是看特定的内容是不是及时出现在了那个界面上.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-25 13:21:52 | 显示全部楼层
我发现如果log文件不实时更新的话,按照我写的代码,python程序是可以正常读取数据且不占用太多CPU的,但是如果log文件一直在不断更新,那么我的代码就会一直占用很高的CPU,我再研究研究~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-25 13:35:20 | 显示全部楼层

回帖奖励 +1 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-25 18:04:20 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-25 19:34:48 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-26 09:09:13 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-26 14:47:47 | 显示全部楼层

回帖奖励 +1 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-29 07:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表