假设多线程应用程序场景,其中每个线程从网络获取一些数据(一个或多个文件),执行一些处理,然后将结果保存在主机的硬盘上。
在这种情况下,总有可能磁盘空间耗尽,从而导致意外的服务行为(例如,系统崩溃)。
为了避免这种情况,如果Java提供了保留硬盘空间的方法,那将会很有帮助,但是,如earlier question中所验证的那样,这样的选项不可用即使是这样,也可能导致分配效率低下(例如,在解压缩应用程序的情况下,预先不知道解压缩数据的总大小)。
因此,另一种方法是使“虚拟磁盘空间预留”,例如通过在内存中保留可用空间的静态注册表,并让每个线程在继续之前从注册表请求容量。
这种方法有更好的替代方案或改进吗?
是否有任何(最好是开源的)Java库实现了这样的功能?
答案 0 :(得分:1)
实现这一点的一种抽象方法可能是使用常量或用户输入的值来确定允许多线程应用程序使用多少磁盘空间,将其保存为变量并具有将获取值的同步get和set方法允许的空间,为线程分配空间(尽可能多,但不多可用),然后减去总数,以便其他线程可以看到减少的'磁盘空间',一旦线程完成,数据被删除重新添加值,以便使用的“磁盘空间”可用于其他线程?
编辑:
它可能导致低效分配(例如,在解压缩应用程序的情况下,预先不知道解压缩数据的总大小)。
如果发生这种情况并且线程“看到”(通过在提取文件时进行常量检查)它已达到“磁盘空间”的限制,则它可以请求更多空间分配(如果可用),或者放回到排队,直到所需空间被其他线程释放
答案 1 :(得分:1)
在> XX%的给定分区用完之后,你能不能简单地触发一个警报?这样你的管理员就有时间进入并删除/复制数据或向该挂载点添加额外的存储空间?