LINUX.ORG.RU

Открыть каталог с 500 тыс. файлов...

 ,


2

3

По следам темы: разыскивается файловый менеджер

Решил протестировать.

Создал каталог с 500 тысячами файлов.

Во всех ФМ стояла сортировка по имени. Точное время не засекал. Каждому ФМ давал 30 секунд на работу. Кто не справился — в таблице написано «дисквалифицирован».

ФМРезультат
nnnоткрывает очень быстро
vifmоткрывает быстро
mcоткрывает быстро
spacefmоткрывает быстро
PathFinderоткрывает секунд за 15-20
xfeдисквалифицирован
pcmanfmдисквалифицирован
stuurmanначинает строить список инкрементально. Но после 100000 скорость падает нелинейно. Так до конца и не добрался.
dolphinстроит список инкрементально. успел одолеть 300000
thunarдисквалифицирован
doublecmdдисквалифицирован
rox-filerна пределе отрезка времени, но открывает
workerна пределе, но открывает

Итого, безусловный фаворит — spacefm:

  • Работает быстро.
  • Имеет графический интерфейс.
  • Многопанельник.
  • Очень конфигурабельный.

Мой stuurman слился. Надо переделывать алгоритм.

★★

Последнее исправление: wandrien (всего исправлений: 4)

Создал каталог с 500 тысячами файлов.

Вот на этом месте надо бы подробнее. Какие файлы? Обычные touch-болванки или с текстовым содержимым? Или может файлы изображений? Многие менеджеры генерируют превьюшки даже к текстовым файлам, что может существенно замедлять открытие и просмотр таких директорий.

Добавь в стартовый тест описание и метод создания подобной директории с 500К файлами. Так твой тест-отчёт будет полным.

EXL ★★★★★
()

Программа для создания N директорий:

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>

int main(int argc, char *argv[])
{
    unsigned begin, end;
    int pat_min, pat_max;
    char *path;
    if (argc == 6) {
        path = argv[1];
        sscanf(argv[2], "%u", &begin);
        sscanf(argv[3], "%u", &end);
        sscanf(argv[4], "%i", &pat_min);
        sscanf(argv[5], "%i", &pat_max);
    } else {
        fprintf(stderr, "mkdirrange <directory> <num_begin> <num_end> <pat_min> <pat_max>\n"
                        "pat_min + pat_max <= 244\n");
        exit(1);
    }

    int dirfd = open(path, O_DIRECTORY);
    if (dirfd == -1) {
        fprintf(stderr, "Can't open %s: %s\n", path, strerror(errno));
        exit(1);
    }
    char dirname[256];
    memset(dirname, 'x', 256);

    for(unsigned current = begin; current < end; current++) {
        int length = sprintf(dirname, "d%10.10u_", current);
        dirname[length] = 'x';
        length += pat_min + (current % pat_max);
        dirname[length] = '\0';
        if(mkdirat(dirfd, dirname, 0755)) {
            fprintf(stderr, "Can't mkdir %s: %s\n", dirname, strerror(errno));
            exit(1);
        } else {
            dirname[length] = 'x';
        }
    }

    return 0;
}

$ mkdir /tmp/test

$ ./mkdirrange /tmp/test/ 0 12 7 3

$ ls -1 /tmp/test/
d0000000000_xxxxxxx
d0000000001_xxxxxxxx
d0000000002_xxxxxxxxx
d0000000003_xxxxxxx
d0000000004_xxxxxxxx
d0000000005_xxxxxxxxx
d0000000006_xxxxxxx
d0000000007_xxxxxxxx
d0000000008_xxxxxxxxx
d0000000009_xxxxxxx
d0000000010_xxxxxxxx
d0000000011_xxxxxxxxx
d ★★★★
()
Ответ на: комментарий от xaizek

Точно, совсем слепой стал. Благодарю.

Gonzo ★★★★★
()
Ответ на: комментарий от d

Программа для создания N директорий

Если кто не знает, сохранить первый раздел (до $ mkdir /tmp/test) в текстовый файл с именем mkdirrange.c и выполнить:

sudo apt install gcc
gcc mkdirrange.c
mv a.out mkdirrange

При желании можно выполнить:

strip --strip-unneeded mkdirrange
что сэкономит пару кб.

anonymous
()
14 января 2021 г.
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.