Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon s3 将100万个图像文件移动到Amazon S3_Amazon S3_Rsync - Fatal编程技术网

Amazon s3 将100万个图像文件移动到Amazon S3

Amazon s3 将100万个图像文件移动到Amazon S3,amazon-s3,rsync,Amazon S3,Rsync,我经营着一个拥有100多万张图片(约150GB)的图片共享网站。我目前正在将它们存储在专用服务器的硬盘上,但空间很快就用完了,所以我想将它们转移到AmazonS3上 我试过做一个RSYNC,RSYNC花了一天多的时间才扫描并创建了图像文件列表。在又一天的传输之后,它只完成了7%,并且使我的服务器慢到了爬行的速度,所以我不得不取消 有没有更好的方法来实现这一点,例如将它们GZIP到另一个本地硬盘,然后传输/解压单个文件 我还想知道将这些文件存储在多个子目录中是否有意义,或者将所有超过百万的文件都存

我经营着一个拥有100多万张图片(约150GB)的图片共享网站。我目前正在将它们存储在专用服务器的硬盘上,但空间很快就用完了,所以我想将它们转移到AmazonS3上

我试过做一个RSYNC,RSYNC花了一天多的时间才扫描并创建了图像文件列表。在又一天的传输之后,它只完成了7%,并且使我的服务器慢到了爬行的速度,所以我不得不取消

有没有更好的方法来实现这一点,例如将它们GZIP到另一个本地硬盘,然后传输/解压单个文件


我还想知道将这些文件存储在多个子目录中是否有意义,或者将所有超过百万的文件都存储在同一目录中是否可以?

一个替代通过网络传输文件的方法是将它们放在硬盘上,并将其发送到亚马逊的服务。您不必担心服务器的网络连接饱和等问题

  • 考虑到S3上还不存在这些文件,将它们作为归档文件发送应该比使用同步协议更快

  • 但是,如果图像文件已经以压缩格式(如JPEG)存储,压缩归档文件对图像文件没有多大帮助(如果有的话)

  • 传输约150 GB的数据将在很长一段时间内消耗大量的网络带宽。如果您尝试使用HTTP或FTP而不是RSYNC进行传输,则情况也是如此。如果可能的话,离线传输会更好;e、 g.发送硬盘、磁带或DVD

  • 从性能角度来看,将一百万个文件放在一个平面目录中是一个坏主意。虽然一些文件系统可以通过
    O(logN)
    文件名查找时间很好地处理这一问题,但其他文件系统不能通过
    O(N)
    文件名查找来处理。将其乘以
    N
    ,即可访问目录中的所有文件。另一个问题是,如果实用程序需要对一百万个文件名进行排序,则需要按文件名顺序访问文件的实用程序可能会显著降低速度。(这可能部分解释了为什么
    rsync
    花了1天进行索引。)

  • 从管理的角度来看,将所有图像文件放在一个目录中是一个坏主意;e、 g.用于备份、归档、移动、扩展到多个光盘或文件系统等


  • 一种选择可能是以惰性方式执行迁移

    • 所有新的图像都会转到AmazonS3
    • 对Amazon上尚未出现的图像的任何请求都会触发该图像到Amazon S3的迁移。(排队)

    这将相当快地将所有最近或通常获取的图像移动到Amazon,从而减少服务器上的负载。然后,您可以添加另一个任务,以便在服务器最不繁忙时缓慢迁移其他任务

    这与编程无关。您可以在服务器不忙的晚上运行它。还有一个“不错”的工具,它可以减少你的慢度问题。由于rsync可以配置为跳过重复,因此速度最终会提高。我肯定会将图像分割成子目录,因为一旦您获得>100000个文件,许多Linux命令就会失败。另一个问题是,如果文件太多,索引节点可能会用完。将1m文件拆分为1000个子目录是否合理?没有理由拥有超过1级的文件,是吗?是的。有多种方法可以做到这一点,这取决于它们的命名和组织方式,以及您希望如何管理它们,等等。如果我要拆分文件,gzip似乎没有意义。。我可以循环遍历数据库中的每个项目,获取文件名,将文件复制到S3,将其文件名更改为mysql autoincrement ID。然后我可以根据文件ID拆分文件(另外,我不再需要在数据库中设置文件名列)。即使需要一个月的时间,我至少可以每天做一些工作,开始从S3读取S3上的文件,并删除服务器上的旧文件以节省空间。这似乎合理?S3没有“文件夹”的缩放问题,因为它没有文件夹。每个文件都有一个键(通常看起来像路径)images/892849845.pn带键的S3文件系统的优点在于它是一个“无限分叉”的文件系统。假设您想在S3中存储所有数据,包括每个图像的标记、图像名称、地理位置等。然后您可以存储一些像images/8248478798.png/tags.json和images/8248478798.png/info.json等非常酷的东西。不幸的是,这不是一个选项,因为我不容易访问数据中心来做类似的事情。我最近正是采用了这种方法,当时我需要将4000万张图像迁移到S3。我已经将我使用的代码放在Github上,希望其他人会觉得这很有用:我也支持这个想法。优雅的