我是Python的新手,下面是我的要求:设备中的内存中有三个文件(即/tmp目录下的文件)。在psutil的帮助下,我将在3个不同的时间间隔(秒、分钟和小时)中计算CPU百分比,并在3个不同的文件中记录所有CPU的使用情况。到目前为止,我可以执行和得到预期的输出。
问题陈述:所面临的问题是,每当它得到60个条目时,我需要旋转文件,这样我们就不会占用设备的太多内存。当第61项进入时,我需要从文件中弹出1项,然后继续。
有人能帮忙吗??
下面是在RAM中创建文件的工作代码:
#! /usr/bin/python
import psutil
while True:
for x in range( 1 ):
for y in range( 3 ):
for z in range( 3 ):
file = open( '/tmp/cpu_sec.txt', 'a' )
file.write( str( psutil.cpu_percent( interval=1 ) ) + '\n' )
file.close()
file = open( '/tmp/cpu_min.txt', 'a' )
file.write( str( psutil.cpu_percent( interval=1 ) ) + '\n' )
file.close()
file = open( '/tmp/cpu_hr.txt', 'a' )
file.write( str( psutil.cpu_percent( interval=1 ) ) + '\n' )
file.close() 发布于 2018-01-25 13:59:29
由于您的数据非常小,我的第一个想法是在内存中旋转,每次都写入完整的数据,即覆盖文件。然后,您可以设置与数组更新周期不同的写入周期。
基本的想法应该是:
import numpy as np
myArray = np.zeros(20)
print myArray
for i in range(10):
myArray= np.append( np.delete ( myArray, 0 ), i)
print myArray用cpu数据替换i,用numpy.savetxt()代替print
另一个想法实际上是使用sed而不是awk。引入行号,您可以这样做:
from psutil import cpu_percent as cp
from time import time
import subprocess
startTime = time()
linenumber = 0
with open("tmpdata.txt", "w", 0) as fPntr:
for i in range( 20 ):
print i
fPntr.write( str(linenumber) + ' ' + '{:1.2f}'.format( time() - startTime) + ' ' + str( cp( interval=1 ) ) + '\n' )
linenumber +=1
for i in range( 120 ):
print i
linenumber = ( linenumber +1 ) % 20
sedString = 's/^{} .*/{}/'.format(linenumber, str(linenumber) + ' ' + '{:1.2f}'.format( time() - startTime) + ' ' + str( cp( interval=1 ) ) )
subprocess.call( ['sed','-i', sedString, 'tmpdata.txt' ] )我介绍了检查它是否正确覆盖的时间。我只使用20个条目,因为我不想等那么久。
第三件事是读取python中的文件,使其旋转并重写,但我不明白这一点。我想第一种选择会比那好得多。不管怎么说,它看起来就像:
myArray = np.zeros(20, dtype=np.int8)
np.savetxt( 'np_tmp.txt', myArray, fmt='%d' )
for i in range(10):
np.savetxt( 'np_tmp.txt', np.append( np.delete ( np.loadtxt( 'np_tmp.txt', dtype=np.int8 ),0 ), i ), fmt='%d' )https://stackoverflow.com/questions/48440747
复制相似问题