multiprocessing.Process вызывает: OSError: [Errno 12] Невозможно выделить память, даже когда я запускаю только 1 процесс - PullRequest
1 голос
/ 10 марта 2019

Я пытаюсь обработать очень большой текстовый файл (~ 11 ГБ) на удаленном сервере (AWS).Обработка файла должна быть довольно сложной, и при использовании обычной программы на Python общее время выполнения составляет ~ 1 месяц.Чтобы сократить время выполнения, я пытаюсь разделить работу над файлом между несколькими процессами.Спецификации компьютера: Спецификации компьютера

Код:

def initiate_workers(works, num_workers, output_path):
    """
    :param works: Iterable of lists of strings (The work to be processed divided in num_workers pieces)
    :param num_workers: Number of workers
    :return: A list of Process objects where each object is ready to process its share.
    """
    res = []
    for i in range(num_workers):
        # process_batch is the processing function
        res.append(multiprocessing.Process(target=process_batch, args=(output_path + str(i), works[i])))
    return res



def run_workers(workers):
    """
    Run the workers and wait for them to finish
    :param workers: Iterable of Process objects
    """
    logging.info("Starting multiprocessing..")
    for i in range(len(workers)):
        workers[i].start()
        logging.info("Started worker " + str(i))
    for j in range(len(workers)):
        workers[j].join()

Я получаю следующую трассировку:

Traceback (most recent call last):
  File "w2v_process.py", line 93, in <module>
    run_workers(workers)
  File "w2v_process.py", line 58, in run_workers
    workers[i].start()
  File "/usr/lib/python3.6/multiprocessing/process.py", line 105, in start
    self._popen = self._Popen(self)
  File "/usr/lib/python3.6/multiprocessing/context.py", line 223, in _Popen
    return _default_context.get_context().Process._Popen(process_obj)
  File "/usr/lib/python3.6/multiprocessing/context.py", line 277, in _Popen
    return Popen(process_obj)
  File "/usr/lib/python3.6/multiprocessing/popen_fork.py", line 19, in __init__
    self._launch(process_obj)
  File "/usr/lib/python3.6/multiprocessing/popen_fork.py", line 66, in _launch
    self.pid = os.fork()
OSError: [Errno 12] Cannot allocate memory

, и это не имеет значения, еслиnum_workers = 1 или 6 или 14, он всегда падает.

Что я делаю не так?

Спасибо!

РЕДАКТИРОВАТЬ

Нашел проблему.Я видел где-то на SO, что fork (последняя строка в traceback) фактически удваивает ОЗУ.При обработке файла я загрузил его в память, что заняло ~ 18 ГБ, и учитывая, что вся емкость ОЗУ составляет 30 ГБ, действительно есть ошибка выделения памяти.Я разделил большой файл на файлы меньшего размера (количество рабочих) и дал каждому объекту Process путь к этому файлу.Таким образом, каждый процесс читает данные лениво, и все отлично работает!

1 Ответ

0 голосов
/ 27 апреля 2019

Нашел проблему.Я видел где-то на SO, что fork (последняя строка в traceback) фактически удваивает ОЗУ.При обработке файла я загрузил его в память, что заняло ~ 18 ГБ, и учитывая, что вся емкость ОЗУ составляет 30 ГБ, действительно есть ошибка выделения памяти.Я разделил большой файл на файлы меньшего размера (количество рабочих) и дал каждому объекту Process путь к этому файлу.Таким образом, каждый процесс читает данные лениво, и все отлично работает!

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