我该使用Python还是汇编语言来编写一个超级快速的复制程序?

18 投票
13 回答
3792 浏览
提问于 2025-04-15 23:36

我需要定期(每年3到5次)复制一个现在有超过2000万个文件、总大小超过1.5TB的仓库。现在我在用RICHCOPY,但也试过其他工具。RICHCOPY似乎是最快的,但我觉得我的XP电脑还没有发挥到极限。

我在考虑用《汇编语言的艺术》里学到的知识,写个程序来复制我的文件。另一个想法是开始学习在Python中使用多线程来进行复制。

我在考虑用汇编语言来做这件事,因为这听起来很有趣,但虽然我的时间不是特别宝贵,但也足够珍贵,所以我想知道这样做能否显著提高复制速度。我假设会有提升,但我只学编程18个月,还是当作爱好在玩。因此,我可能对解释型语言的一些基本概念还不太了解。

如果有人有观察或经验分享,我会很感激。需要说明的是,我不需要任何代码。我已经用Python 2.6写了一个基本的复制程序,速度不比RICHCOPY慢。我想知道哪种方法能让我更快。目前,从一个硬盘复制到Drobo再从Drobo复制回硬盘,花费我超过50个小时。我有一个LogicCube,用来简单地复制硬盘,但有时我需要从硬盘到Drobo或反向复制。我在想,既然我可以用LogicCube在不到七个小时内对一个3/4满的2TB硬盘进行扇区复制,那么用汇编语言也应该能接近这个速度,但我不太确定这是否合理。(是的,有时候无知也是一种幸福)

我需要加快速度的原因是,我经历过两三次复制过程中发生了意外(50个小时的时间可不短,不能指望世界一直静止),导致我不得不放弃复制,重新开始。例如,上周我们楼下的水管破裂,导致停电。

感谢大家的早期回复,但我认为这不是I/O限制。我没有通过网络传输,硬盘是通过SATA连接到主板,Drobo是通过Firewire端口连接的,我认为这两种连接都应该支持更快的传输。

实际上,除了从单个硬盘到Drobo,我不能使用扇区复制。反向复制时不行,因为Drobo的文件结构我搞不清楚。我的非科学观察是,从一个内部硬盘复制到另一个内部硬盘的速度并不比从Drobo到内部硬盘的速度快。

我受限于硬件,买不起10K转的2TB硬盘(如果有的话)。

你们中的一些人建议使用文件同步解决方案。但这并不能解决我的问题。首先,我试过的文件同步解决方案在开始之前会先建立一个数据映射(找不到更好的词),我有太多小文件,所以它们会卡住。我使用RICHCOPY的原因之一就是它会立即开始复制,而不是先用内存建立映射。其次,我的三个Drobo备份中有一个在几周前失败了。我的规则是,如果有一个备份失败,其他两个必须保持离线,直到新备份建立完成。所以我需要从我用LogicCube的三个单驱备份中复制数据。

最终,我必须在单个硬盘上有一个好的备份,因为这就是我交付给客户的内容。由于我的客户系统各异,我会把数据交付给他们的SATA硬盘上。

我还租了一些云空间,数据也存储在那儿作为最深层的备份,但从那里取数据是很贵的。

13 个回答

8

这里有两个地方可能会导致速度变慢:

  • 逐个文件复制的速度比直接从磁盘复制慢得多(也就是说,你是把每个扇区的数据完全复制一遍)。特别是对于20MB的文件来说,这个问题更明显。即使你用最优化的汇编代码也无法解决这个问题,除非你把文件复制改成直接复制原始磁盘数据。在这种情况下,汇编确实能帮上忙(或者用C语言)

  • 单纯存储20MB的文件并递归查找它们在Python中可能效率不高。但这更可能是因为需要找到更好的算法,而不是用汇编语言能显著改善的。而且,这也不会是导致50小时的主要原因。

总结一下 - 如果你进行的是原始磁盘扇区复制,汇编会有帮助;但如果你是在文件系统层面复制,那就没什么用。

42

复制文件是一个受输入输出限制的过程。也就是说,重新用汇编语言来写这个程序,可能不会让速度变快。而且,即使使用多线程(同时处理多个任务),也可能会让速度变得更慢,因为不同的线程同时请求不同的文件,会导致硬盘的寻址次数增加。

在这种情况下,使用标准工具可能是最好的选择。如果你想要优化速度,可以考虑更换文件系统或者升级硬件。

8

正如其他回答提到的,复制文件时,磁盘的读写速度是个瓶颈。你使用的编程语言其实影响不大。文件的存放方式和数据传输的方式才是关键。

你提到要复制到DROBO设备上。你的DROBO是怎么连接的呢?可以看看这个连接速度的图表

我们来看看不同连接方式下的最大复制速度:

  • 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的dd命令),这通常比文件系统级别的复制要快得多(因为没有随机的磁盘寻址和目录遍历或碎片文件的问题)。

要使用dd,你可以在你的电脑上启动Linux(或者使用cygwin?)。可以参考这个页面,或者看看这个关于用Ubuntu的Live CD从Windows备份文件的教程

如果你把1.5 TB的数据整理到一个RAID中,可能会加快复制速度(因为多个硬盘可以并行读取),而且(根据配置)还可以保护你免受硬盘故障的影响。

撰写回答