2013-03-30 2 views
0

У меня есть в общей сложности 10 файлов (может быть больше в какой-то момент, но это будет фиксированное число).Python: чтение с нескольких файлов

Они небольшие - около 80 байт.

Читая от них все хорошо и работает - его медленно. Я предполагаю, потому что сценарий обрабатывает их один за другим и ждет ввода-вывода - поэтому я начал читать в Threading и Queue, но я не смог найти рабочее решение ...

Может ли кто-нибудь дать мне пример открытие нескольких файлов с резьбой?

код Я хотел бы поставить на несколько потоков:

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

Судя по пути, на [Малине PI] (http://www.raspberrypi.org/). У нас даже есть [Малиновая 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 мкс на файл.

Edit:

Увидев код, это кажется довольно сложным для того, что он делает. Я бы структурировать так:

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

Спасибо за помощь - похоже, проблема кроется в другом месте. Похоже, что информация Probe собирается только после того, как файл будет доступен, что замедляет работу. Так что проблема с доступом к файлам здесь не кажется. Спасибо за помощь, чтобы в любом случае сделать правильный цикл для файлов!:) – Jrc