использование многопроцессорной обработки для чтения файлов в Python3 - PullRequest
0 голосов
/ 29 апреля 2019

У меня очень большие файлы. Каждый файл почти 2 ГБ. Поэтому я хотел бы запустить несколько файлов параллельно. И я могу сделать это, потому что все файлы имеют одинаковый формат, поэтому чтение файлов может выполняться параллельно. Я знаю, что должен использовать многопроцессорную библиотеку, но я действительно не понимаю, как использовать ее с моим кодом.

Мой код для чтения файлов:

def file_reading(file,num_of_sample,segsites,positions,snp_matrix):
    with open(file,buffering=2000009999) as f:
        ###I read file here. I am not putting that code here.
        try:
            assert len(snp_matrix) == len(positions)
            return positions,snp_matrix ## return statement
        except:
            print('length of snp matrix and length of position vector not the same.')
            sys.exit(1)

Моя основная функция:

if __name__ == "__main__":    
    segsites = []
    positions = []
    snp_matrix = []




    path_to_directory = '/dataset/example/'
    extension = '*.msOut'

    num_of_samples = 162
    filename = glob.glob(path_to_directory+extension)

    ###How can I use multiprocessing with function file_reading
    number_of_workers = 10

   x,y,z = [],[],[]

    array_of_number_tuple = [(filename[file], segsites,positions,snp_matrix) for file in range(len(filename))]
    with multiprocessing.Pool(number_of_workers) as p:
        pos,snp = p.map(file_reading,array_of_number_tuple)
        x.extend(pos)
        y.extend(snp)

Итак, мой ввод в функцию выглядит следующим образом:

  1. file - список, содержащий имена файлов
  2. num_of_samples - значение int
  3. segsites - изначально пустой список, к которому я хочу добавить, когда читаю файл.
  4. позиции - изначально пустой список, к которому я хочу добавить, когда я читаю файл.
  5. snp_matrix - изначально пустой список, к которому я хочу добавить, когда я читаю файл.

Функция возвращает список позиций и список snp_matrix в конце. Как я могу использовать многопроцессорность для этого, где мои аргументы являются списками и целыми числами? То, как я использовал многопроцессорность, дает мне следующую ошибку:

TypeError: file_reading () отсутствует 3 обязательных позиционных аргумента: 'segsites', 'позиции' и 'snp_matrix'

1 Ответ

1 голос
/ 30 апреля 2019

Элементы в списке, которые передаются в файл Pool.map, не распаковываются автоматически.Как правило, вы можете иметь только один аргумент в вашей функции 'file_reading'.

Конечно, этот аргумент может быть кортежем, поэтому нет проблем распаковать его самостоятельно:

def file_reading(args):
    file, num_of_sample, segsites, positions, snp_matrix = args
    with open(file,buffering=2000009999) as f:
        ###I read file here. I am not putting that code here.
        try:
            assert len(snp_matrix) == len(positions)
            return positions,snp_matrix ## return statement
        except:
             print('length of snp matrix and length of position vector not the same.')
            sys.exit(1)

if __name__ == "__main__":    
    segsites = []
    positions = []
    snp_matrix = []

    path_to_directory = '/dataset/example/'
    extension = '*.msOut'

    num_of_samples = 162
    filename = glob.glob(path_to_directory+extension)

    number_of_workers = 10

    x,y,z = [],[],[]


    array_of_number_tuple = [(filename[file], num_of_samples, segsites,positions,snp_matrix) for file in range(len(filename))]
    with multiprocessing.Pool(number_of_workers) as p:
        pos,snp = p.map(file_reading,array_of_number_tuple)
        x.extend(pos)
        y.extend(snp)
...