60秒。稍等片刻,在控制台上使用 rm large.csv-6ren">
gpt4 book ai didi

java - 为什么 Files.deleteIfExists 对于大文件需要这么长时间?

转载 作者:行者123 更新时间:2023-12-01 07:44:01 24 4
gpt4 key购买 nike

在大文件上(此处35GB):

Files.deleteIfExists(Path.get("large.csv"));

使用java删除需要>60秒。稍等片刻,在控制台上使用 rm large.csv 删除。

为什么?我可以在 java 中加快大文件删除速度吗?

最佳答案

我会把这归咎于操作系统。在 Windows 和 Linux 上,Java 只需调用操作系统提供的 C native 运行库提供的方法即可删除文件。

(查看 OpenJDK 源代码。)

<小时/>

那么为什么操作系统可能需要很长时间才能删除大文件?

  • 典型的文件系统保存空闲和正在使用的磁盘 block 的映射。如果您要释放一个非常大的文件,则会释放大量 block ,因此需要更新释放映射中的大量位并将其写入磁盘。

  • 典型的文件系统使用基于树的索引结构将文件偏移量映射到磁盘 block 。如果文件足够大,索引结构可能会跨越多个磁盘 block 。当文件被删除时,需要扫描整个索引来找出包含需要释放数据的所有 block 。

  • 如果文件碎片严重,并且索引 block 和空闲 map block 广泛分散,这些成本就会放大。

  • 删除文件通常是同步完成的。至少,在系统调用返回之前,所有磁盘 block 都被标记为空闲。 (如果您不这样做,用户可能会提示删除文件​​不起作用。)

简而言之,当您删除一个大文件时,需要执行大量“磁盘”I/O。操作系统执行此操作,而不是 Java。

<小时/>

那么为什么从命令行删除文件会更快呢?

一个可能的原因是,您使用的 rm 命令实际上只是将已删除的文件移至“垃圾箱”文件夹。这实际上是一个重命名操作,而且比真正的删除要快得多。

注意:这不是 Linux 上 rm 的正常行为。

另一个可能的原因(在 Linux 上)是您要删除的文件的索引和空闲映射 block 在一个测试场景中位于缓冲区高速缓存中,而不是在另一个测试场景中。 (如果你的机器失去了多余的RAM,Linux操作系统会将磁盘 block 缓存在RAM中以提高性能。效果相当不错。)

关于java - 为什么 Files.deleteIfExists 对于大文件需要这么长时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58501658/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com