首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Files.deleteIfExists要花这么长时间处理大文件?

问为什么Files.deleteIfExists要花这么长时间处理大文件?
EN

Stack Overflow用户
提问于 2019-10-22 09:56:28
回答 1查看 830关注 0票数 0

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

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

使用java删除需要>60。删除控制台上的rm large.csv,请稍等。

为什么?我能在java中加速大文件的删除吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-22 10:50:16

我会把这归咎于操作系统。在Windows和Linux上,Java简单地调用OS提供的C本地运行时库提供的方法来删除文件。

(检查OpenJDK源代码。)

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

  • 是一个典型的文件系统,它保存一个磁盘块的映射,这些磁盘块是免费的还是在使用中的。如果您正在释放一个非常大的文件,大量块将被释放,因此需要更新空闲映射中的大量位并将其写入磁盘。
  • 典型的文件系统使用基于树的索引结构将文件偏移映射到磁盘块。如果文件足够大,索引结构可能跨越多个磁盘块。当文件被删除时,需要扫描整个索引,以显示包含需要释放的数据的所有块。如果文件碎片严重,而索引块和空闲地图块通常是同步执行的,则scattered.
  • Deleting
  • 会放大这些代价。至少,在syscall返回之前,所有磁盘块都标记为空闲。(如果不这样做,用户可能会抱怨删除文件无效。)

。

简而言之,当您删除一个巨大的文件时,有许多“磁盘”I/O要做。操作系统是这样做的,而不是Java。

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

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

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

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58501658

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档