Резервирование виртуального дискового пространства в Java
Предположим, сценарий многопоточного приложения, в котором каждый поток получает некоторые данные (один или несколько файлов) из сети, выполняет некоторую обработку, а затем сохраняет результаты на жестком диске хост-машины.
В таком случае всегда существует вероятность того, что дисковое пространство исчерпано, что приводит к непредвиденному поведению службы (например, сбой системы).
Чтобы избежать подобного случая, было бы полезно, если бы Java предоставила средство резервирования места на жестком диске, но, как было проверено в предыдущем вопросе, такая опция недоступна, и даже если бы она была, это могло привести к неэффективному распределению (например, в случае приложения распаковки, которое не знает заранее общий размер распакованных данных).
Таким образом, альтернативой может быть создание "резервирования виртуального дискового пространства", например, сохраняя в памяти статический реестр свободного пространства и имея каждый поток, запрашивающий емкость из реестра, прежде чем продолжить.
Есть ли лучшие альтернативы или улучшения этого подхода?
Есть ли (желательно с открытым исходным кодом) библиотека Java, которая реализует такую функциональность?
2 ответа
Абстрактный способ реализовать это может состоять в том, чтобы использовать постоянное или введенное пользователем значение количества дискового пространства, которое разрешено использовать многопоточному приложению, сохранить его как переменную и синхронизировать методы get и set, которые получат значение разрешенного пространства. выделите ему место для потока (столько нужно, но не больше, чем доступно), а затем минус это из общего количества, чтобы другие потоки могли видеть уменьшенное "дисковое пространство" и после завершения потока и удаления данных повторно добавить значение, чтобы использованное "дисковое пространство" стало пригодным для использования другими потоками?
РЕДАКТИРОВАТЬ:
это может привести к неэффективному распределению (например, в случае приложения распаковки, которое не знает заранее общий размер распакованных данных).
Если это происходит, и поток "видит" (через постоянную проверку при извлечении файла), что он достиг своего предела "дискового пространства", он может затем запросить дополнительное выделение места, если оно доступно, или поместить его в очередь до необходимое пространство было освобождено другими потоками
Не могли бы вы также просто получить предупреждение, которое срабатывает после того, как>XX% данного раздела будет использовано? Таким образом, у вашего администратора есть время войти и удалить / скопировать данные или добавить дополнительное хранилище к этой точке монтирования?