4

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

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

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

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

有没有更好的选择,或者这种方法的改进?

是否有任何(最好是开源的)Java 库实现了这种功能?

4

2 回答 2

2

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

编辑:

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

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

于 2012-06-27T21:56:19.037 回答
1

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

于 2012-06-27T21:59:28.260 回答