【问题标题】:Moving files using shutil.move is too slow使用 shutil.move 移动文件太慢
【发布时间】:2021-11-24 09:45:16
【问题描述】:

我正在尝试使用shutil.move 将文件从一个文件夹移动到同一 HD 中的另一个文件夹。然而,这个过程需要很长时间才能完成。通常在这些操作中,文件太多(几乎 2,000 个),这些文件的总和超过 1TB。

我查看了shutil.move 文档,并解释说shutil.move 在其后面使用了一个复制功能(我想这就是这个过程如此缓慢的原因):

shutil.move(src, dst, copy_function=copy2)

递归地将文件或目录 (src) 移动到另一个位置 (dst) 并返回目标。

如果目标是现有目录,则将 src 移动到该目录中。如果目的地已经存在但不是 目录,它可能会根据 os.rename() 语义被覆盖。

如果目标位于当前文件系统上,则使用 os.rename()。否则,使用 copy_function 将 src 复制到 dst,然后 删除。在符号链接的情况下,一个指向目标的新符号链接 src 将在 dst 中或作为 dst 创建,src 将被删除。

如果给出了copy_function,它必须是一个可调用的,带有两个参数src和dst,并且将用于将src复制到dst,如果 os.rename() 不能使用。如果源是目录,则 copytree() 被调用,将其传递给 copy_function()。默认的copy_function 是copy2()。使用 copy() 作为 copy_function 允许移动到 当无法同时复制元数据时成功,在 不复制任何元数据的费用。

我已经尝试在 shutil.move 文档中提供的复制功能之间进行更改,但这并没有缩短移动文件的时间。

当我尝试使用ctrl + X 自己移动文件时,文件会立即移动。有人知道我可以使用的shutil.move 的替代方法是否与ctrl + X 命令具有相同的性能?

提前致谢。

编辑

我将所有要移动的文件放在一个文件夹中,然后执行shutil.move,所以我的代码就是:

src_folder = 'C:/Users/sim/Documents/files_to_move'
dst_folder = 'C:/Users/sim/Documents/_out/'

shutil.move(src_folder, dst_folder)

我也在使用 Windows 10。

【问题讨论】:

  • Ctrl-X 是剪切操作的快捷键。这与将文件从一个地方复制到另一个地方有什么关系?此外, shutil.move() 将(有效地)实现 mv (在类 Unix 系统上)这将非常快,因为当源和目标位于同一文件系统上时文件实际上不会被复制。请出示您的代码,让我们知道您使用的是什么操作系统
  • 将文件从一个文件夹剪切到另一个文件夹(移动)正是我想要的。但在我看来,shutil.move 正在将文件从源文件夹复制到目标文件夹。之所以出现这种假设是因为当shutil.move 运行时,我实际上可以看到文件“出现”在目标文件夹中。而且我想这个复制过程是什么让我花费了太多时间。我的代码很简单:shutil.move(folder_a, folder_b)。我在 Windows 10 上运行它。
  • 源和目标是在同一个文件系统上,还是在两个独立的文件系统之间移动?在前一种情况下,您只会获得恒定时间的性能(或者更确切地说,性能随要移动的项目数量而不是这些项目的大小而变化)。
  • 您看到文件一次出现一个并不能告诉我们任何有用的信息。重要的问题是这些文件背后的数据块是被重写还是只是更新了指向它们的目录条目。如果您的文件系统由于某种原因慢得离谱,那么在后一种情况下一次出现一个文件仍然是合理的。
  • 最可靠的方法是跟踪执行。您可以在系统调用级别使用 strace(或任何 Windows 等效工具)等工具执行此操作,或者在 Python 级别使用 python -m trace

标签: python shutil


【解决方案1】:

我不知道为什么我在使用 shutil.move 时会遇到这个问题。

我正在使用相同的文件系统(也在同一个硬盘驱动器中),当我执行shutil.move(src, dst) 时,该过程需要数小时才能完成,而当我手动执行时(使用ctrl-X 快捷方式)相同文件被立即移动。

我设法改用os.rename 解决了这个问题,现在它工作得很好(文件移动得很快,就像使用ctrl-X 快捷方式一样)。如果其他人遇到同样的问题,我会在这里留下这个答案,也许这会有所帮助。

【讨论】:

    猜你喜欢
    • 2020-07-19
    • 2014-06-08
    • 2015-05-02
    • 2012-04-06
    • 2014-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多