Я протестировал все предоставленные вами решения, но ни одно из них не работает ... я заметил, что когда я пытался запустить apache2, выскакивает ошибка, он создает новый каталог с расширением diff /var/lock/apache2.uEM, /var/lock/apache2.gpk и т. д.
Вы ищете Java-эквивалент флага O_DIRECT
для open(2)
. См.http://man7.org/linux/man-pages/man2/open.2.html
Это можно сделать для открытого экземпляра файла, но не для самого файла постоянно. Вы делаете это для каждого экземпляра открытого файла, используя прямой ввод-вывод. Я не знаю, как это сделать в Java, но в C и C++ вы передаете флаг O_DIRECT
вызову open()
.
Обратите внимание, однако, что это имеет пару потенциально проблематичных последствий, а именно:
fsync()
или fdatasync()
, а прямая запись ввода-вывода может вообще не отображаться для кэшированного чтения ввода-вывода . Однако существует альтернативный метод, если вы можете допустить временное хранение данных в кэше.Вы можете использовать интерфейс POSIX fadvise (через системный вызов posix_fadvise
в Linux ), чтобы сообщить ядру, что вам не нужны данные из файла, когда вы закончите его чтение. С помощью флага POSIX_FADV_DONTNEED
вы можете указать ядру удалить определенную область определенного файла из кеша. На самом деле вы можете сделать это, когда вы обрабатываете файл (, читая фрагмент, а затем сразу после чтения вызывая posix_fadvise
в этой области файла ), хотя области, которые вы вызываете, должны быть выровнены. к размеру страницы системы. Как правило, это предпочтительный переносимый метод обработки вещей, поскольку он работает на любой POSIX-совместимой системе с реальными -расширениями времени (, что практически соответствует любой POSIX-совместимой системе ).