我总共有10个文件(在某些时候可能更多 - 但它将是一个固定的数字)。
它们很小 - 大约80字节。
虽然从他们那里读书都很好并且有效 - 但它很慢。 我猜它是因为脚本逐个处理它们并等待IO - 所以我开始阅读线程和队列,但我无法找到一个可行的解决方案......
有人能给我一个打开几个文件的例子吗?
代码我想提出几个主题:
try:
with open("/home/pi/sensoren/sensor1", "r") as sensor1, open("/home/pi/sensoren/sensor2", "r") as sensor2, open("/home/pi/sensoren/sensor3", "r") as sensor3, open("/home/pi/sensoren/sensor4", "r") as sensor4, open("/home/pi/sensoren/sensor5", "r") as sensor5, open("/home/pi/sensoren/sensor6", "r") as sensor6, open("/home/pi/sensoren/sensor7", "r") as sensor7, open("/home/pi/sensoren/sensor8", "r") as sensor8, open("/home/pi/sensoren/sensor9", "r") as sensor9, open("/home/pi/sensoren/sensor10", "r") as sensor10:
sensoren = [sensor1, sensor2, sensor3, sensor4, sensor5, sensor6, sensor7, sensor8, sensor9, sensor10]
temp = [ ]
#CRC checker
def checkCrc(line):
if "YES" in line:
return True
return False
#Temperatur Funktion
def getTemp(line):
temp = line.rstrip("\n")
temp = temp.split("t=")
temp = temp[1]
#den -62 error abfangen - sollte klappen
if temp == "-62":
temp = "00"
return str(temp)
#Temperaturen auslesen und zuweisen
for currentSensor in sensoren:
if checkCrc(currentSensor.readline()):
#CRC OK
temp.append(getTemp(currentSensor.readline()))
else:
#CRC ERROR
temp.append("00")
except IOError as e:
print("Fehler bei Dateioperationen: %s" % e.strerror)
答案 0 :(得分:3)
如果您一次性完成,读取小文件的速度并不慢。
首先,让我们创建一个80字节的测试文件;
dd if=/dev/random of=test1.dat bs=80 count=1
然后我们定义一个函数来读取它的所有内容;
In [1]: def readfile(name):
...: with open(name) as f:
...: data = f.read()
...: return data
...:
然后,定时运行(从普通硬盘读取,而不是SSD):
In [3]: %timeit readfile('test1.dat')
10000 loops, best of 3: 18.1 us per loop
所以读取这样的文件需要18μs。我不会那么慢。
当我创建其中9个测试文件并在循环中读取它们时:
In [3]: %timeit for i in xrange(1,10): readfile('test{:d}.dat'.format(i))
1000 loops, best of 3: 184 us per loop
由于环路开销,每个文件仍然只有大约21μs。
修改强>
看过你的代码后,它的功能似乎相当复杂。我会这样构造它:
data = []
temp = []
for sn in ['/home/pi/sensoren/sensor{:d}'.format(i) for i in range(1,11)]:
#xrange if Python 2.x
with open(sn) as f:
data.append(f.read())
# the data list now contains all sensor data
for num, s in enumerate(data):
# check for CRC
d = s.strip()
if d.startswith("YES"):
t = d.split("t=")
# populate temp list
if t[1] == '-62':
temp.append("00")
else:
temp.append(t[1])
优点: