我应该使用Python还是Assembly来实现超快速复制程序

2024-10-01 09:27:35 发布

您现在位置:Python中文网/ 问答频道 /正文

作为维护问题,我需要定期(每年3-5次)复制一个存储库,该存储库现在有超过2000万个文件,总磁盘空间超过1.5 TB。我目前正在使用RICHCOPY,但也尝试过其他方法。RICHCOPY似乎是最快的,但我不相信我正在接近XP机器的能力极限。在

我在玩弄用我在汇编语言艺术中读到的东西来写一个程序来复制我的文件。我的另一个想法是开始学习如何在Python中多线程进行复制。在

我一直在考虑在汇编中做这件事,因为它看起来很有趣,但是虽然我的时间并不是非常宝贵,但它足够宝贵,我正试图弄清楚我是否会看到复制速度有足够大的提高。我想我会的,但我才开始真正学习编程18个月,它仍然或多或少是一个爱好。因此,我可能遗漏了一些关于解释语言发生什么的基本概念。在

任何观察或经验将不胜感激。注意,我不是在找任何代码。我已经用python2.6编写了一个不比RICHCOPY慢的基本复制程序。我在寻找一些能让我更快的观察结果。现在我要花50多个小时从磁盘复制到Drobo,然后从Drobo复制到磁盘。我有一个逻辑立方体,当我只是复制一个磁盘,但有时我需要从一个磁盘到Drobo或相反的方向。我在想,如果我可以使用LogicCube在不到7个小时内扇区复制一个3/4个2 TB的驱动器,那么我应该可以使用汇编来接近它,但我不知道足够的知识来知道这是否有效。(是的,有时候无知就是幸福)

我需要加快速度的原因是我有两到三个周期,在复制过程中发生了一些事情(50小时是一个很长的时间来期待世界静止),这导致我不得不扔掉复制品并重新开始。例如,上周我们大楼下面的水管坏了,停电了。在

感谢您的早期响应,但我不认为这是I/O限制。我不是通过网络,硬盘通过sata连接插入母板,Drobo插入火线端口,我的想法是这两个连接都应该允许更快的传输。在

实际上我不能使用扇区拷贝,只能从一个磁盘到Drobo。因为Drobo文件结构是个谜,所以它不会以另一种方式工作。我不科学的观察是,从一个内部磁盘复制到另一个内部磁盘并不比从Drobo复制到内部磁盘快。在

我受硬件的束缚,我买不起10K rpm 2 TB的硬盘(如果他们生产的话)。在

你们中的许多人建议使用文件同步解决方案。但这并不能解决我的问题。首先,我用过的文件同步解决方案构建了一个数据的映射(为了更好的术语),首先,我有太多的小文件,所以他们窒息。我使用RICHCOPY的原因之一是它立即开始复制,它不使用内存来构建映射。第二,几周前我的三个Drobo备份中有一个失败了。我的规则是,如果我有一个备份失败,其他两个必须保持离线,直到新的一个建立。所以我需要从我的三个备份单驱动器拷贝中的一个拷贝,我用的是LogicCube。在

一天下来,我必须在一个驱动器上有一个好的拷贝,因为这是我交付给客户的。因为我的客户有不同的系统,我提供给他们的是SATA驱动器。在

我从别人那里租了一些云空间,我的数据也作为最深的备份存储在那里,但如果离开那里的话,代价很高。在


Tags: 文件程序时间原因备份tb磁盘驱动器
3条回答

减速有两个地方:

  • 每个文件拷贝比磁盘拷贝慢得多(实际上,克隆每个扇区的数据都是100%)。尤其是20毫米的锉刀。除非您从克隆文件切换到克隆原始磁盘数据,否则无法用最优化的程序集修复该程序集。在后一种情况下,是的,Assembly确实是您的票(或C)。

  • 在Python中,简单地存储20毫米文件并递归地查找它们可能效率较低。但这更像是一种寻找更好算法的功能,不太可能通过汇编得到显著改进。另外,这将不是50小时的主要贡献者

总而言之,如果您执行原始磁盘扇区复制,程序集将有所帮助,但如果您执行文件系统级复制,则不会有帮助。

正如其他答案提到的(+1表示),在复制文件时,磁盘i/o是瓶颈。你用的语言不会有什么不同。你如何安排你的文件将产生影响,你如何传输数据将产生影响。在

你提到过抄袭一个机器人。你的DROBO是怎么连接的?看看这个graph of connection speeds。在

让我们看看在某些导线类型上可以获得的最大复制速率:

  • USB=97天(1.5 TB / 1.5 Mbps)。跛子,至少你的表现还不错。在
  • USB2.0=~7小时(1.5 TB / 480 Mbps)。也许是LogicCube?在
  • 快速SCSI=~40小时(1.5 TB / 80 Mbps)。也许你的硬盘速度?在
  • 100 Mbps以太网=1.4天(1.5 TB / 100 Mbps)。在

所以,根据你问题的限制,你可能做不到更好。但是,您可能希望开始执行原始磁盘复制(如Unix's dd),这应该比文件系统级的复制快得多(它更快,因为没有随机磁盘搜索目录遍历或碎片文件)。在

要使用dd,您可以在机器上实时引导linux(或者使用cygwin?)。请参见this page for referencethis one about backing up from windows using a live-boot of Ubuntu。在

如果您要在RAID上组织1.5 TB的数据,您可能可以加快复制速度(因为磁盘将并行读取),而且(取决于配置),它还有一个额外的好处,即保护您不受驱动器故障的影响。在

复制文件是一个I/O绑定的过程。您不太可能看到在汇编中重写它的速度会加快,甚至多线程也可能会导致速度变慢,因为同时请求不同文件的不同线程将导致更多的磁盘查找。在

使用标准工具可能是最好的方法。如果有什么需要优化的,您可能需要考虑更改文件系统或硬件。在

相关问题 更多 >