Эффективный способ фильтрации непустых каталогов в Python - PullRequest
0 голосов
/ 14 апреля 2020

У меня около 6 миллионов заданий в системе на основе UNIX. Для каждого из них мне нужно будет создать каталог, в котором будут храниться некоторые результаты и файлы журналов. Я исследовал быстрые способы в Python, чтобы:
1 - создать несколько подкаталогов (по одному на моделирование)
2 - проверить, содержит ли каждая из этих подкаталогов хотя бы один файл, который может иметь или не иметь расширение

Мой лучший подход до сих пор заключался в создании каталогов с os.mkdir и фильтрации непустых каталогов с помощью

for x in Path('.').iterdir():
    try:
        if os.listdir(x): # if list is not empty
            # do what I have to do
    except: pass

Я пробовал это в серии, но это занимает огромное количество времени , Интересно, как я мог выполнить эту задачу параллельно. Есть мысли?

1 Ответ

3 голосов
/ 14 апреля 2020

Вы можете попробовать многопроцессорный пул. Эта задача, в основном, связана с диском, поэтому я не уверен, насколько она вам поможет. Я решил не использовать pathlib, потому что передача Path объектов немного тяжелее, чем просто строка в дочерние процессы.

import os
import multiprocessing as mp
import multiprocessing.pool

# examples for process and thread
USE_THREAD_POOL = True
if USE_THREAD_POOL:
    Pool = multiprocessing.pool.ThreadPool
else:
    Pool = multiprocessing.Pool

def _directory_worker(dirpath):
    for fn in os.listdir(dirpath):
        if fn not in (".", ".."):
            # do your thing
            return

def directory_processor(dirpath):
    subdirs = [os.path.join(p) for p in os.listdir(dirpath)]
    # pick number of workers.... I am randomly saying half the cores
    worker_count = int(min(mp.cpu_count()/2, len(subdirs)))
    with Pool(worker_count) as pool:
        list(pool.imap_unordered(_directory_worker, subdirs, 
            chunksize=int(len(subdirs)/worker_count)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...