Unix stat () / lstat () для Java - PullRequest
       13

Unix stat () / lstat () для Java

5 голосов
/ 15 декабря 2009

Предположим, я хочу получить несколько свойств файла (владелец, размер, разрешения, время), возвращаемых системным вызовом lstat (). Одним из способов сделать это в Java является создание объекта java.io.File и выполнение для него таких вызовов, как length (), lastModified () и т. Д. Пока у меня две проблемы:

  1. Каждый из этих вызовов запускает вызов stat (), и для моих целей stat () считаются дорогими: я пытаюсь сканировать миллиарды файлов параллельно на сотнях хостов и (для первое приближение) единственный способ получить доступ к этим файлам - через NFS, часто с кластерами файлов, где stat () под нагрузкой может занять полсекунды.

  2. Вызов не lstat (), обычно это stat () (который следует по символическим ссылкам) или fstat64 () (который открывает файл и может инициировать операцию записи для записи времени доступа).

Есть ли «правильный» способ сделать это, чтобы я в итоге просто сделал один вызов lstat () и получил доступ к членам struct stat? Что я нашел так далеко от Google:

  • JDK 7 будет иметь интерфейс PosixFileAttributes в java.nio.file со всем, что я хочу (но я бы предпочел не запускать ночные сборки моего JDK, если я могу этого избежать).

  • Я могу развернуть свой собственный интерфейс с JNI или JNA (но я бы предпочел, если бы он существовал).

A предыдущий аналогичный вопрос получил пару предложенных реализаций JNI / JNA. Один ушел, а другой поддерживается с сомнением (например, нет загрузок, только хранилище hg).

Есть ли лучшие варианты?

Ответы [ 2 ]

2 голосов
/ 15 декабря 2009

Похоже, вы в значительной степени покрыли все основы. Когда я начал читать ваш вопрос, моей первой мыслью был JDK 7 или JNI. Не зная ничего о шаблоне изменений в этих файлах, вы также можете заглянуть в какой-то постоянный кеш рассматриваемой информации, например во встроенную БД. Вы могли бы также взглянуть на какой-то другой метод доступа, кроме NFS, например на пользовательский веб-сервис, который предоставляет объемную информацию о файле с удаленного хоста.

1 голос
/ 28 июня 2011

Да, stat () находится под всеми вызовами и библиотеками. Это проблема латентности. Тем не менее, вы можете выполнять много stat () одновременно, так как есть много демонов NFS-серверов для поддержки ваших соединений, используя потоки, если у кого-то нет асинхронного stat () в рукаве! Если бы вы могли попасть на хост, как с ssh, stat () была бы намного дешевле. Вы могли бы даже написать службу tcp для потоковой передачи по путям и потоковой передачи stat (). К сожалению, доступ к серверу NFS затруднен или невозможен, поскольку он может иметь только учетные записи администратора, например Hitachi SAN или что-то в этом роде.

...