将1000万张图像复制到另一个服务器上

现在我知道你不应该把1000万个文件放到一个目录中。 把它归咎于开发者,但是现在就是这样。 我们将修复它并将它们移动到文件夹组中,但首先我们需要将它们从生产框中复制出来。

我第一次尝试rsync,但它会惨败。 我认为这是因为在内存中存储文件的名称和path大于内存和交换空间。

然后我试图把它压缩到一个tar.gz,但它不能解压缩,文件太大的错误(这是60GIGS)。

我试图做一个焦油焦油exaction,但我得到了“无法打开:文件太大”

tar c images/ | tar x –C /mnt/coverimages/ 

额外信息:

/ mnt / coverimages /是我们想要将图像移动到的nfs共享。

所有文件都是图片

操作系统:Gentoo

如果你安装了rsync版本3+,它会做一个滚动的文件列表来传输,而不需要把整个文件列表保存在内存中。 将来你可能会考虑散列文件名,并根据这些散列的一部分创build一个目录结构。

你可以看到这个答案,以了解我的意思是哈希。

如果我能安排停机时间,我会简单地暂时移动磁盘。

你有没有尝试过使用find和-exec(或者xargs),就像

 find images/ -exec cp "{}" /mnt/coverimages/ \; 

我不完全认为你有“tar | tar”命令。 尝试这个

tar cf - images/ | cd /mnt/coverimages && tar xf -

另一个select是通过SSHstream(一些CPUencryption的开销):

tar cf - images/ | ssh user@desthost "cd /path/coverimages && tar xf -"

还有cpio,它更隐蔽一点,但提供了类似的function:

find images/ | cpio -pdm /mnt/coverimages/

我会想象你的两个select是增量移动文件集使用正则expression式来匹配文件名,或卸载文件系统,并复制整个设备。

哇。 祝你好运。

将你的rsyncs或者你使用的任何工具分成几个工作。 如果这些文件是用某种逻辑或编号命名的,则可以告诉系统一次rsync X个文件。

如果你已经有一个NFS挂载,不会简单的cp -au足够吗?

我相信一个tar-over-network(ssh或netcat)可能会更快(更less等待往返)。

此外,事先调查ionice – 您的生产用户将感谢您

一个说明,经典的NFS写入是同步的,所以如果你导出你正在读取的目录,然后在本地写入,性能会更好。

我认为find解决scheme是最好的select(嗯,我想知道使用nohup之类的,并产生一个后台进程,以加快一点点,但这可能不是一个胜利)。 查找意味着你只是走在目录和处理每个文件,因为你find它,这意味着你从来没有想过的整个文件列表。

可能有办法将所有文件分离到单独的目录中,然后构build一个仅包含指向这些文件的硬链接的单个目录? 这样,您的开发人员就可以以任何方式访问这些文件,作为单个目录或作为单独的目录(例如按月分隔):

 /home/user/directory/file1-slink /home/user/directory/file2-slink /home/user/dir-month-07/file1 /home/user/dir-month-06/file2