Теперь я знаю, что никогда не следует помещать 10 миллионов файлов в один каталог. Винить в этом разработчиков, но в нынешнем виде я нахожусь именно на этом. Мы исправим это и переместим их в группы папок, но сначала мы должны скопировать их из производственной коробки.
Сначала я попробовал rsync, но ничего не вышло. Я предполагаю, что это было из-за того, что имя и путь к файлам в памяти были больше, чем объем оперативной памяти и места подкачки.
Затем я попытался сжать все это в tar.gz, но он не смог распаковать его, файл слишком большой ошибки (было 60 гигов).
Я попытался просто выполнить преобразование tar в tar, но получил сообщение «Невозможно открыть: слишком большой файл»
tar c images/ | tar x –C /mnt/coverimages/
Дополнительная информация:
/ mnt / coverimages / - это общий ресурс nfs, куда мы хотим переместить изображения.
Все файлы изображения
ОС: Gentoo
Если вы установите версию 3+ rsync, он создаст скользящий список файлов для передачи, и ему не нужно будет хранить весь список файлов в памяти. В будущем вы, вероятно, захотите рассмотреть возможность хеширования имен файлов и создания структуры каталогов на основе частей этих хэшей.
Ты можешь видеть этот ответ чтобы понять, что я имею в виду под хешированием.
Если бы я мог организовать простои, я бы просто временно переставил диск.
вы пробовали использовать find и -exec (или xargs), что-то вроде
find images/ -exec cp "{}" /mnt/coverimages/ \;
?
Я не совсем думаю, что вы правильно поняли команду tar | tar. Попробуй это
tar cf - images/ | cd /mnt/coverimages && tar xf -
Другой вариант - потоковая передача по SSH (некоторые накладные расходы ЦП для шифрования):
tar cf - images/ | ssh user@desthost "cd /path/coverimages && tar xf -"
Также есть cpio, который немного менее понятен, но предлагает аналогичные функции:
find images/ | cpio -pdm /mnt/coverimages/
Я бы предположил, что у вас есть два варианта: постепенно перемещать набор файлов с помощью регулярных выражений для соответствия имен файлов или отключать файловую систему и копировать все устройство.
Вот это да. Удачи.
Сегментируйте ваши rsync или любой другой инструмент, который вы используете, на несколько задач. Если файлы названы с какой-то логикой или нумерацией, вы можете указать системе rsync X количество файлов за раз.
Если у вас уже есть монтирование nfs, разве не хватит простого cp -au?
Я верю, что tar-over-network (ssh или netcat) может быть быстрее (меньше ожидания круговых обходов).
Кроме того, заранее изучите ionice - ваши производственные пользователи будут вам благодарны
Замечание, что классическая запись NFS была синхронной, поэтому производительность была бы лучше, если бы вы экспортировали каталог, из которого читаете, а затем записываете локально.
Я думаю, что решение find - лучший выбор (хммм, мне интересно, использовать nohup или что-то подобное и запускать фоновый процесс, чтобы немного ускорить процесс, но это может быть не победой). Найти означает, что вы просто просматриваете каталог и обрабатываете каждый файл по мере его нахождения, что означает, что вы никогда не думаете обо всем списке файлов.
Может быть способ разделить все файлы в отдельные каталоги, а затем создать один каталог, содержащий только жесткие ссылки на эти файлы? Таким образом, ваши разработчики могли получить доступ к файлам как в одном каталоге, так и в отдельных каталогах (например, с разделением по месяцам):
/home/user/directory/file1-slink
/home/user/directory/file2-slink
/home/user/dir-month-07/file1
/home/user/dir-month-06/file2