chaturanga

Рейтинг
122
Регистрация
22.08.2012
Dram :

На серваке Дебиан есть папка с подпапками. Есть ли решение, которое сожмет без потери качества png и jpg не меняя названия файлов? Чтобы уровень сжатия был сопоставим с сайтом https://www.iloveimg.com

Пока я попробовал эти команды

Сжимает, но далеко не так хорошо как указанный выше сайт. Есть ли еще решения?

jpegoptim собран с MozJPEG?

всё-таки Гленливет победил меня вчера :)

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

Так я и не претендую на оригинальность. Например, эта идея отлично отражена в реализации модуля nginx proxy_cache_path. Там вложенность, вроде, ограничена 3-мя уровнями.

Sly32 #:

То есть правильно я понял - имя файла соответствует искомому айдишнику? Если я хочу проверить  например айди 12345

что в вашей задаче ключ, и что его значение?
в предложенном решении  файл - ключ, содержимое  - значение

Aisamiery #:

Не боитесь что у вас inode закончатся в системе?

неа, я осознаю с чем работаю и (по-прежнему) больше боюсь кривой хеш-функции

Aisamiery #:

Зачем вы пытаетесь изобрести SQLite?

Так пятница же :)

Sly32 #:

вычитать все имена файлов в нем - это уже IO операция.  Потом для каждого  имени получить  MD и уже на его основе построить дерево? 

не ВСЕ имена. В одном файле - одно значение. По сути, если значение не нужно (а нужны только ключи), то файл может быть пустым и даже не быть вообще - финальным будет также каталог

Sly32 #:

вот есть на диске условно 10 файлов. 1.txt, 2.txt, 3.txt ... мне нужно обратиться системными средствами к нужному каталогу

У нас есть 2 задачи:

1) внести имя файла в список
2) узнать, есть ли такое имя файла в списке

в обоих случаях мы вычисляем хеш файла (пусть md5, хотя это не лучший вариант)

MD5 (1.txt) = dd7ec931179c4dcb6a8ffb8b8786d20b
MD5 (2.txt) = c3d57eb88086a04b1e04d06a9b6188e5
MD5 (3.txt) = 3d70dca5cadfff6563d95a05a0b2a0f3
MD5 (10.txt) = ecd44780e3d8ebde70851f940606bc7e

то есть файлы лягут в каталоги, и если нам нужен только хеш, то даже файла создавать не будем

$ mkdir -p "./dd/7e/c9/31/17/9c/4d/cb/6a/8f/fb/8b/87/86/d2/0b"
1.txt:
dd
  7e
    c9
      ...
        0b
2.txt:
c3
  d5
    7e
      ...
        e5
3.txt:
3d
  70
    dc
      ...
        f3
10.txt:
ec
  d4
    47
      ...
        7e

2) узнать, есть ли такое имя файла в списке (опять же вычисляем хеш и проверям есть ли такой каталог)

$ ls -1 "./dd/7e/c9/31/17/9c/4d/cb/6a/8f/fb/8b/87/86/d2/0b" && echo "exists"
exists

$ ls -1 "./dd/7e/c9/31/17/9c/4d/cb/6a/8f/fb/8b/87/86/d2/AA" || echo "not exists" ls: ./dd/7e/c9/31/17/9c/4d/cb/6a/8f/fb/8b/87/86/d2/AA: No such file or directory not exists
Самое сложное для конкретной задачи подобрать быструю и надёжную хеш-функцию. Например для вычисления 2-х координат мы можем использовать функцию Кантора - универсально и вроде неплохо, но если мы знаем точный размер карты (пусть10x10), то можем написать её намного проще а-ля hash = x*10+y и получим огромный прирост скорости.
Sly32 #:

Мне кажется, ты счас описал NoSQL))) Ну примерно.

Ну там всё сложнее, тот же редис использует разные способы индексации, в некоторых случаях и классический B-Tree

Sly32 #:

Но правильно я понял - хэши имен файлов нужно где-то хранить? 

Нет,  хеши вычисляются в момент обращения (чтения/записи)

Sly32 #:

а что по скорости тут?

классический unordered map

Скорость будет зависеть от глубины ведра (односвязного списка), которая зависит от качества hash-функции определяющей ведро.

В данном случае стоит идти дальше и строить дерево, добиваясь, чтобы в одном файле было не более 1-й строки. Условно брать md5 от имени файла, разбивать по 2 символа и каждый следующий уровень размещать в подкаталоге.

а-ля: MD5 (FileName) = 1e621df39e053ff6bc7db7bb1c616cc1

1e
  62
    1d
      ...
        c1

так мы исключаем возможность "разбухания" каталога на любом уровне ограничив его 256-ю файлами, а доступ к элементу будет осуществляться одним системным вызовом fopen, без всяких последующих хождений по файлам (связным спискам). По сути скорость (за вычетом хеш-функции) обращения сравняется со скоростью открытия сокета для доступа к БД и на порядок обгонит работу с ней.

NoMoreContent #:
function getPartitionCodeByYouTubeId($ytId){
    $idFiltered = preg_replace('[^a-z\d]', '', strtolower($ytId));
    if(strlen($idFiltered) >= 2){
        return substr($idFiltered, 0, 2)
    }
    throw new IdErrorException(11111);
}

Применительно к данному коду (как пример неудачной хеш-функции), если большинство имён файлов будут начинаться с условного "aa" мы и получим проблему глубокого ведра.


Ну вот же - я всегда подозревал, что Набоков не сам писал свои тексты :)

Кусок моей статьи (100 % авторский контент)

- Human (4%) - AI (96%)

Автопереведёнка биографии гугл-транс

- Human (62%) - AI (38%)

Deepl

- Human (18%) - AI (82%)

Только что сгенерированное описание фрукта (gpt 3.5)

- Human (24%) - AI (76%)
Всего: 356