将打开的文件移动到不同的设备

将打开的文件移动到不同的设备

我正在运行一个应用程序,该应用程序正在生成一个大型(~200GB)输出文件,并且需要大约 35 小时才能运行(目前我大约需要 12 小时)。应用程序只打开文件一次,然后在写入时保持打开状态,直到完成;应用程序还对文件进行大量随机访问写入(即不是顺序写入)。

现在,该文件正在保存到我的本地硬盘驱动器,但我只是决定,当它完成后,我将把它移动到另一个设备(网络驱动器,通过 SMB 安装的 NTFS)。

为了节省时间而不是稍后移动文件,有什么方法可以挂起程序并以某种方式将当前部分完成的文件移动到其他设备,执行一些技巧,然后恢复程序,以便它现在使用新位置?

我非常肯定答案是否定的,但我想我会问,有时那里有令人惊讶的技巧......

答案1

由于文件是随机写入的,因此发布另一个解决方案打破了我的tail想法。这里的想法rsync可能是有希望的,因为rsync可以使用增量传输算法进行操作,通过仅发送文件的更改部分来节省传输时间。如果您rsync在两个本地文件上运行,它将默认为--whole-file模式,这不是您想要的。

建议

rsync -av --inplace --no-whole-file /your/local/file.dat /your/remote/file.dat

...或者也许(如果 CIFS 安装不同意增量传输)使用 pure rsync

rsync -av --inplace --no-whole-file /your/local/file.dat remoteserver:/your/directory/file.dat

因此,当 200 GB 文件填满时,您需要多次运行此命令。每次运行它时,它都会增量更新远程文件。当源文件随机更新时,这甚至应该起作用。也许您可以每 15 分钟运行一次。然后,当您的 pid 完成时,您将再次运行它,这将是一个快速增量增量。

答案2

假设网络驱动器已安装(NFS 或其他),

tail -f -c1000000000000 /your/local/file.dat > /mnt/nfs/drive/file.dat

这将开始将输出文件复制到网络驱动器并保持同步。当您的程序完成时,您应该在本地和网络文件系统上看到相同的 200GB 文件。也许对两者都进行 md5sum 来验证。

某些 UNIX 风格可能还支持运行,tail--pid={Your pid here}pid 完成时,它将自动停止拖尾。

答案3

我没有足够的信用来发表评论。

诚然,它没有回答问题。这就是为什么它只能被视为评论。尽管如此,它还是清楚地展示了一些内部观点。这就是为什么我认为这个评论值得写在这个页面上。感谢您的时间。我不以任何方式隶属于网站

我发现移动删除后打开文件句柄,这是从 2021 年中期开始的,很好地解释了这里发生的事情。在我看来,这比复制,在评论中指出米拉胡5 月 3 日 13:55。

相关内容