【问题标题】:Virtual disk space reservation in javajava中的虚拟磁盘空间预留
【发布时间】:2012-06-27 21:41:54
【问题描述】:

假设一个多线程应用场景,其中每个线程从网络获取一些数据(一个或多个文件),执行一些处理,然后将结果保存在宿主机的硬盘上。

在这种情况下,总是有可能磁盘空间耗尽,导致意外的服务行为(例如,系统崩溃)。

为了避免这种情况,如果 Java 提供一种保留硬盘空间的方法会很有帮助,但是,正如在 earlier question 中验证的那样,这样的选项不可用,甚至如果是这样,可能会导致分配效率低下(例如,在解压缩应用程序的情况下,它事先不知道解压缩数据的总大小)。

因此,另一种方法可能是进行 “虚拟磁盘空间预留”,例如通过在内存中保留可用空间的静态注册表,并在继续之前让每个线程从注册表中请求容量。

是否有更好的替代方案或改进这种方法?

是否有任何(最好是开源的)Java 库可以实现此类功能?

【问题讨论】:

  • 也许我理解错了,但我下面的答案是一种抽象的方式来实现你在 Q 中提出的问题
  • 是的,您的回答是实现我上面所说的“虚拟磁盘保留”的合理方法。 :-)

标签: java diskspace


【解决方案1】:

实现这一点的一种抽象方法可能是使用一个常量或用户输入的值,即允许多线程应用程序使用多少磁盘空间,将其保存为变量,并使用同步的 get 和 set 方法来获取该值允许的空间,为线程分配空间(需要多少但不超过可用空间),然后从总数中减去,这样其他线程可能会看到“磁盘空间”减少,并且一旦线程完成并删除数据重新添加该值,以便使用的“磁盘空间”可供其他线程使用?

编辑:

这可能导致分配效率低下(例如,在解压缩应用程序的情况下,它事先不知道解压缩数据的总大小)。

如果发生这种情况并且线程“看到”(通过在提取文件时不断检查)它已达到其“磁盘空间”限制,则它可以请求更多空间分配(如果可用),或者被放回排队,直到其他线程释放所需的空间

【讨论】:

    【解决方案2】:

    难道您不能在给定分区的 >XX% 用完后触发警报吗?这样您的管理员就有时间进入并删除/复制数据或向该挂载点添加额外的存储空间?

    【讨论】:

    • 这意味着一个线程轮询本地磁盘以获取可用磁盘空间,并以某种方式通知其他线程可用性。我认为最好让每个线程在尝试使用它之前明确地“询问”它需要保留的空间,以避免即时失败。
    • 我实际上在想一个每 1/5/10/X 分钟运行一次的 cron 作业,它会使用 'df' 或类似的命令来查看剩余的空间,并发送电子邮件/文本警报到系统管理员。除非您每小时增加 100 GB。
    猜你喜欢
    • 2017-11-18
    • 1970-01-01
    • 1970-01-01
    • 2015-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多