concurrent.futures.ThreadPoolExecutor () не хватает некоторых файлов для обработки - PullRequest
0 голосов
/ 30 октября 2018

Я использую Python (v 3.7.0) и мне нужно обработать более 17 770 текстовых файлов. Мне нужно иметь отдельную строку для каждого файла, а затем поместить данные файлов в пандус DataFrame ( Y ) в отдельные столбцы на основе данных. Для ускорения процесса я использую concurrent.futures.ThreadPoolExecutor(), но похоже, что некоторые файлы не обрабатываются.

def lineProcess(file):
   #This function takes a single file as input and processes it line by line
   #It simultaneously adds the relevant data in the pandas DataFrame Y
   with open(file) as f:
   #a takes the first line of each file which will be the row of DataFrame Y
      a = int(f.readline().split(':')[0])
      for line in f.readlines():
      #Now reading from 2nd line onwards
         b = int(line.split(',')[0])
         c= int(line.split(',')[1])
         #Y is the DataFrame in which the data needs to be stored
         Y.loc[str(a), str(b)] = c

def fileProcess():
   #This function makes the call to function lineProcess() for each file
   import glob2
   fileslist = glob2.glob("*.txt")
   import concurrent.futures
   with concurrent.futures.ThreadPoolExecutor() as executor:
      executor.map(lineProcess, fileslist)

if __name__ == '__main__':
   #Main fnction to make the call to fileProcess function()
   import pandas
   global Y
   Y = pandas.DataFrame()
   fileProcess()
   print(Y)

Теперь, чтобы протестировать программу, я запустил ее, используя только 5 текстовых файлов (fileslist[:] = fileslist[0:5]). Предположим, что текстовые файлы: (textfile1.txt, textfile2.txt, textfile3.txt, textfile4.txt, textfile5.txt) и первая строка каждого текстового файла (который соответствует одной строке кадра данных Y) будет иметь номера 1, 2, 3, 4, 5 i, e, данные 1-го файла будут в строка с rowname 1, строка второго файла в строке с rowname 2 и так далее. Теперь, после запуска вышеуказанной программы, вывод будет следующим: (я показываю два выхода, соответствующих выполнению кода два раза) :

   2059652  1666394  1759415   ...     1687086  1188337  2100070
2      4.0      3.0      4.0   ...         NaN      NaN      NaN
1      NaN      NaN      NaN   ...         NaN      NaN      NaN
3      NaN      NaN      NaN   ...         NaN      NaN      NaN
5      NaN      NaN      NaN   ...         5.0      4.0      1.0

   1065039  1544320  410199  732556   ...     2317644  1687086  1188337  2100070
1      NaN      NaN     NaN     NaN   ...         NaN      NaN      NaN      NaN
4      3.0      1.0     5.0     NaN   ...         NaN      NaN      NaN      NaN
2      NaN      NaN     NaN     NaN   ...         NaN      NaN      NaN      NaN
5      NaN      NaN     NaN     NaN   ...         5.0      5.0      4.0      1.0

Порядок строк (2, 1, 3, 5 или 1, 4, 2, 5) является случайным и меняется каждый раз, когда я запускаю над программой, но замечает , что код здесь пропущен при заполнении данных, соответствующих номеру файла. textfile4.txt (строка с именем 4 отсутствует) в первом запуске и textfile3.txt (строка с именем 3 отсутствует) во втором запуске. Пример текстовых файлов, которые я обрабатываю, выглядит следующим образом (скажем, textfile1.txt):

1:
1488844,3
822109,5
885013,4
30878,4
...(#so on)
...