Создание алгоритма структуры файловой системы для автоинкрементных изображений - PullRequest
1 голос
/ 24 августа 2010

У меня есть почти 1 миллион фотографий с автоинкрементом, начиная с "1".

Итак, у меня есть следующее:

1.jpg
2.jpg
3.jpg
4.jpg
5.jpg
....
1000000.jpg

В настоящее время у меня есть все эти файлы водин каталог Ext4 linux.

Как вы можете себе представить, файловая система работает очень медленно.

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

Например:

1000/1.jpg
1000/2.jpg
1000/3.jpg
...
1000/999.jpg
1000/1000.jpg
2000/1001.jpg
2000/1002.jpg
2000/1003.jpg
2000/1999.jpg

Как бы я разделил / modulus / implode / сдвинул имя изображения (id) в файловую структуру, подобную приведенной выше?

ОБНОВЛЕНИЕ :

По сути, я хочу создать функцию PHP, которая выполняет следующие действия.

  • Принимает только положительные целые числа, не включая 0.
  • Для значений 1-999, вернуть 0
  • Для значений 1000-1999, вернуть 1000
  • Для значений 10,000-10,999, вернуть 10000
  • Длязначения 25 000-25 999, возвращаемые 25000

Ответы [ 4 ]

1 голос
/ 24 августа 2010

Когда я делал подобные вещи в прошлом, я создаю подкаталоги из крайних правых цифр, чтобы при увеличении они добавлялись во все каталоги более равномерно:

4/3/1234.jpg
5/3/1235.jpg
6/3/1236.jpg
7/3/1237.jpg
8/3/1238.jpg

Ваш комментарий:

как бы я это сделал с PHP?

Вот пример функции в PHP:

function NumToPath($n)
{
  $n = (int) $n;
  if ($n <= 0) {
    return false;
  }
  $n = str_pad($n, 7, "0", STR_PAD_LEFT);
  preg_match("/.*(\d)(\d)$/", $n, $matches);
  $path = $matches[2] . "/" . $matches[1] . "/" . $n . ".jpg";
  return $path;
}
0 голосов
/ 24 августа 2010

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

<?php
// specify your image directory, no trailing slash
$imagedir = 'your/path/to/images';

// loop through each jpg file in the image directory
foreach (glob($imagedir.'/*.jpg') as $file)
{
    // determine new folder name
    $newdir = floor(basename($file) / 1000) * 1000; 
    // ^ php will interpret the filename's number for the calculation
    // eg: ('999.jpg' / 1000) returns .999

     // ensure the 0 folder name is not null
    if (!$newdir) {
        $newdir = '0';
    }

    // add the new folder to the image directory
    $newdir = $imagedir.'/'.$newdir; 
    if (!is_dir($newdir)) {
        mkdir($newdir);
    }

    // move the image
    rename($file, $newdir.'/'.basename($file);
}
?>
0 голосов
/ 24 августа 2010

Текущий (инкрементный) номер следует хранить в метафайле, чтобы его можно было быстро найти Все остальное довольно просто:

$directory = ceil($num / 1000) * 1000;
$filename  = $num . '.jpg';
$path      = $directory . '/' . $filename;
0 голосов
/ 24 августа 2010

Я думаю, вы думаете, что сложно. непроверенный очень простой способ сделать это:

for($i=0;$i<1000000;$i++){
  if(file_exists($i.'.jpg'){
     $multi = floor($i/1000);
     $dir = ($multi <= 1) $dir = 1000 : $dir=$multi*1000;

     if(!is_dir($dir)){
        mk_dir($dir);
     }

     move($i.'.jpg',$dir.'/'.$i.'.jpg);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...