Использование пула для одновременного чтения нескольких файлов в Jupyter Windows навсегда: - PullRequest
0 голосов
/ 20 ноября 2018

Я хочу прочитать 22 файла (хранящихся на моем жестком диске), каждый из которых содержит около 300 000 строк для хранения в одном фрейме данных pandas.Мой код смог это сделать за 15-25 минут.Первоначально я подумал: я должен сделать это быстрее, используя больше процессоров.( поправьте меня, если я ошибаюсь, и если все ЦП не могут считывать данные с одного и того же жесткого диска в одно и то же время, однако, в этом случае мы можем предположить, что в дальнейшем данные могут присутствовать на разных жестких дисках,так что это упражнение все еще полезно ).

Я нашел несколько постов типа this и this и попробовал код ниже.

import os
import pandas as pd
from multiprocessing import Pool

def read_psv(filename):
    'reads one row of a file (pipe delimited) to a pandas dataframe'
    return pd.read_csv(filename,
                       delimiter='|',
                       skiprows=1, #need this as first row is junk
                       nrows=1, #Just one row for faster testing                    
                       encoding = "ISO-8859-1", #need this as well                       
                       low_memory=False
                      )



files = os.listdir('.') #getting all files, will use glob later
df1 = pd.concat((read_psv(f) for f in files[0:6]), ignore_index=True, axis=0, sort=False) #takes less than 1 second

pool = Pool(processes=3)
df_list = pool.map(read_psv, files[0:6]) #takes forever
#df2 =  pd.concat(df_list, ignore_index=True) #cant reach this 

Это занимает вечность (более 30-60 минут, без завершения, когда я убиваю процесс).Я также прошел подобный вопрос, как мой , но бесполезный.

РЕДАКТИРОВАТЬ: Я использую Jupyter на Windows.

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Таким образом, проблема не связана с плохой производительностью или застреванием при вводе / выводе.Проблема связана с Jupyter и Windows.В Windows нам нужно включить условие if, например: if __name__ = '__main__': перед инициализацией пула.Для Jupyter нам нужно сохранить работника в отдельный файл и импортировать его в код.Jupyter также проблематичен, так как не выдает журнал ошибок по умолчанию.Я узнал о проблеме с Windows, когда запустил код на оболочке Python.Я узнал об ошибке Jupyter, когда запустил код в Ipython Shell.Следующий пост мне очень помог.

Для Jupyter

Для Windows Issue

0 голосов
/ 20 ноября 2018

Ваша задача связана с IO, узким местом является жесткий диск.ЦП должен выполнить лишь небольшую работу для разбора каждой строки в CSV.

Считывания с диска выполняются быстрее, если они последовательные.Если вы хотите прочитать большой файл, лучше всего, чтобы диск начал искать, а затем просто прочитал все его байты последовательно.

Если у вас есть несколько больших файлов на одном жестком диске и читаете с нихиспользуя несколько процессов, тогда дисковая головка должна будет переключаться между ними, где каждый переход занимает до 10 мс.

Многопроцессорная обработка может все еще ускорить ваш код, но вам нужно будет хранить свои файлы нанесколько дисков, поэтому каждая головка диска может сосредоточиться на чтении одного файла.

Другой вариант - купить SSD.Время поиска диска намного меньше при 0,1 мс, а пропускная способность примерно в 5 раз выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...