Python:线程化读取多个文件

Python:线程化读取多个文件,python,Python,我总共有10个文件(在某个时候可能会更多,但这将是一个固定的数字) 它们很小,大约有80字节 虽然读这些书都很好,而且很有效,但速度很慢。 我猜这是因为脚本一个接一个地处理它们并等待IO-所以我开始阅读线程和队列,但我无法想出一个有效的解决方案 谁能给我一个打开几个文件的例子 我想将代码放在几个线程中: try: with open("/home/pi/sensoren/sensor1", "r") as sensor1, open("/home/pi/sensoren/sens

我总共有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)

阅读小文件并不慢,只要你一次性完成

首先,让我们创建一个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读取):

因此,读取这样一个文件需要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])
优点:

  • 这将一次性读取每个传感器文件
  • 它还可以删除每个传感器的两个函数调用
  • 更不用说打字了

只要一次完成,读取小文件并不慢

首先,让我们创建一个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读取):

因此,读取这样一个文件需要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])
优点:

  • 这将一次性读取每个传感器文件
  • 它还可以删除每个传感器的两个函数调用
  • 更不用说打字了

发布一些您尝试过的代码,指定哪些代码不起作用。这将使你的问题更具建设性。文件存储在什么类型的设备上?从路径判断,存储在一台计算机上。我们甚至有一个更好的选择!发布一些您尝试过的代码,指定哪些代码不起作用。这将使你的问题更具建设性。文件存储在什么类型的设备上?从路径判断,存储在一台计算机上。我们甚至有一个更好的选择!结论是:不要为此使用线程,开销可能只会使它变慢!谢谢你的帮助,但问题似乎出在别处。看起来只有在文件被访问时才会收集探测器信息,这会减慢速度。因此,这里的问题似乎不是文件访问。谢谢你的帮助,无论如何,我会为这些文件做一个适当的循环@Jrc:您应该检查信息是在文件打开时生成的还是在读取时生成的。在前一种情况下,在读取文件之前,先在一个单独的循环中打开和关闭所有文件,这样可以节省一些时间。@Jrc:请记住,有些传感器速度很慢。以前的计算机有一个传感器芯片,可以报告i2c上的电压和温度。IIRC,它每秒只提供一次新值…是的,它很慢-从所有传感器获取数据平均需要大约8秒。我得用它!结论是:不要为此使用线程,开销可能只会使它变慢!谢谢你的帮助,但问题似乎出在别处。看起来只有在文件被访问时才会收集探测器信息,这会减慢速度。因此,这里的问题似乎不是文件访问。谢谢你的帮助,无论如何,我会为这些文件做一个适当的循环@Jrc:您应该检查信息是在文件打开时生成的还是在读取时生成的。在前一种情况下,在读取文件之前,先在一个单独的循环中打开和关闭所有文件,这样可以节省一些时间。@Jrc:请记住,有些传感器速度很慢。以前的计算机有一个传感器芯片,可以报告i2c上的电压和温度。IIRC,它每秒只提供一次新值…是的,它很慢-从所有传感器获取数据平均需要大约8秒。我得用它!