2013-03-30 78 views
0

我总共有10个文件(可能在某些时候更多 - 但它会是一个固定的数字)。Python:多个文件的线程读取

它们很小 - 约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) 
+2

发布您尝试过的一些代码,指定哪些不起作用。这会让你的问题更具建设性。 – favoretti

+0

文件存储在哪种设备上? –

+0

从路径判断[Raspberry PI](http://www.raspberrypi.org/)。我们甚至有一个[Raspberry PI Stack Exchange](http://raspberrypi.stackexchange.com)! – Adam

回答

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微秒读取这样的一个文件。我不会那么慢。

当我创建这些测试文件的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微秒。

编辑:

在看到你的代码,它似乎为它做什么相当复杂。我想构建这样的:

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]) 

优点:

  • 这读取一气呵成每个传感器文件。
  • 它还删除每个传感器的两个函数调用。
  • 更少打字。
+0

结论是:**不要使用线程为此,开销可能会让它变慢!** – Adam

+0

@codesparkle相当多。 –

+0

感谢您的帮助 - 但似乎问题在于别处。它看起来像探测信息只在文件被访问时才被收集 - 这会降低速度。所以不是文件访问是这里的问题。感谢您的帮助,无论如何都要为文件做一个适当的循环!:) – Jrc