Генерация случайных каталогов / файлов с учетом количества файлов и глубины - PullRequest
2 голосов
/ 12 октября 2009

Я бы хотел профилировать какое-то программное обеспечение VCS, и для этого я хочу создать набор случайных файлов в случайно расположенных каталогах. Я пишу сценарий на Python, но мой вопрос вкратце: как создать случайное дерево каталогов со средним числом подкаталогов на каталог и некоторым широким распределением файлов на каталог?

Разъяснение: Я не сравниваю различные форматы репозитория VCS (например, SVN против Git против Hg), но профилирую программное обеспечение, которое имеет дело с SVN (и в конечном итоге другими) рабочими копиями и репозиториями.

Я хотел бы указать ограничения на общее количество файлов (назовите его 'N', вероятно, ~ 10k-100k) и максимальную глубину структуры каталогов ('L', вероятно, 2-10). Мне все равно, сколько каталогов генерируется на каждом уровне, и я не хочу, чтобы в конечном итоге было 1 файл на каталог или 100 тыс. В одном каталоге.

В дистрибутиве я не уверен, так как я не знаю, будут ли VCS (в частности SVN) работать лучше или хуже с очень однородной структурой или очень искаженной структурой. Тем не менее, было бы неплохо, если бы я мог придумать алгоритм, который не «выравнивал» для больших чисел.

Моими первыми мыслями были: сгенерировать дерево каталогов, используя какой-либо метод, а затем равномерно заполнить дерево файлами (обрабатывая каждый каталог одинаково, без учета вложенности). Мои кальки с обратной стороны конверта говорят мне, что если есть уровни 'L', с подкаталогами 'D' на каталог, и около sqrt (N) файлов на каталог, то будет около D ^ L, так что N = ~ sqrt (N) * (D ^ L) => D = ~ N ^ (1 / 2L). Итак, теперь у меня есть приблизительное значение для «D», как я могу сгенерировать дерево? Как мне заполнить файлы?

Я был бы благодарен только за некоторые ссылки на хорошие ресурсы по алгоритмам, которые я мог бы использовать. Мой поиск нашел только красивые апплеты / flash.

Ответы [ 3 ]

4 голосов
/ 12 октября 2009

Почему бы не скачать реальные репозитории с открытым исходным кодом и использовать их?

Вы думали о том, что входит в файлы? это тоже случайные данные?

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

Недавно я написал небольшой пакет Python randomfiletree, который генерирует случайную структуру файлов / каталогов. Код и инструкция на https://github.com/klieret/randomfiletree.

Алгоритм перебирает существующее файловое дерево и создает количество файлов и каталогов в каждой подпапке на основе гауссианы с определенной шириной и ожидаемым значением. Затем этот процесс повторяется.

В основном используется что-то вроде этого:

def create_random_tree(basedir, nfiles=2, nfolders=1, repeat=1,
                       maxdepth=None, sigma_folders=1, sigma_files=1):
    """
    Create a random set of files and folders by repeatedly walking through the
    current tree and creating random files or subfolders (the number of files
    and folders created is chosen from a Gaussian distribution).

    Args:
        basedir: Directory to create files and folders in
        nfiles: Average number of files to create
        nfolders: Average number of folders to create
        repeat: Walk this often through the directory tree to create new
            subdirectories and files
        maxdepth: Maximum depth to descend into current file tree. If None,
            infinity.
        sigma_folders: Spread of number of folders
        sigma_files: Spread of number of files
    Returns:
       (List of dirs, List of files), all as pathlib.Path objects.
    """
    alldirs = []
    allfiles = []
    for i in range(repeat):
        for root, dirs, files in os.walk(str(basedir)):
            for _ in range(int(random.gauss(nfolders, sigma_folders))):
                p = Path(root) / random_string()
                p.mkdir(exist_ok=True)
                alldirs.append(p)
            for _ in range(int(random.gauss(nfiles, sigma_files))):
                p = Path(root) / random_string()
                p.touch(exist_ok=True)
                allfiles.append(p)
            depth = os.path.relpath(root, str(basedir)).count(os.sep)
            if maxdepth and depth >= maxdepth - 1:
                del dirs[:]
    alldirs = list(set(alldirs))
    allfiles = list(set(allfiles))
    return alldirs, allfiles

Это довольно быстрый и грязный подход, но можно также разработать этот модуль, если есть интерес.

0 голосов
/ 12 октября 2009

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

Если вам не нравится генератор случайных чисел в python, вы можете взглянуть на некоторые другие статистические пакеты в pypi или, если вы хотите что-то более тяжелое, например, привязки python для научной библиотеки GNU.

http://sourceforge.net/projects/pygsl/

http://www.gnu.org/software/gsl/

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