【问题标题】:Unix stat()/lstat() for Java用于 Java 的 Unix stat()/lstat()
【发布时间】:2011-06-28 04:52:49
【问题描述】:

假设我想获取 lstat() 系统调用返回的文件的几个属性(所有者、大小、权限、时间)。在 Java 中执行此操作的一种方法是创建一个 java.io.File 对象并在其上执行 length()、lastModified() 等调用。到目前为止我有两个问题:

  1. 这些调用中的每一个都会触发一个 stat() 调用,并且出于我的目的,stat() 被认为是昂贵的:我试图在数百台主机上并行扫描数十亿个文件,并且(到第一近似值)访问这些文件的唯一方法是通过 NFS,通常针对负载下的 stat() 可能需要半秒的文件管理器集群。

  2. 调用不是 lstat(),它通常是 stat()(跟随符号链接)或 fstat64()(打开文件并可能触发写入操作以记录访问时间)。

是否有一种“正确”的方式来做到这一点,这样我最终只需要进行一次 lstat() 调用并访问 struct stat 的成员吗?到目前为止,我从谷歌上找到了什么:

  • JDK 7 将在 java.nio.file 中拥有 PosixFileAttributes 接口,其中包含我想要的一切(但如果可以避免的话,我宁愿不运行我的 JDK 的夜间构建)。

  • 我可以使用 JNI 或 JNA 推出自己的接口(但如果有现有的接口,我宁愿不这样做)。

previous similar question 获得了一些建议的 JNI/JNA 实现。一个消失了,另一个维护有问题(例如,没有下载,只是一个 hg 存储库)。

还有更好的选择吗?

【问题讨论】:

    标签: java unix file-io posix


    【解决方案1】:

    看起来您几乎涵盖了所有基础。当我开始阅读您的问题时,我的第一个想法是 JDK 7 或 JNI。在不了解这些文件的更改模式的情况下,您可能还会查看相关信息的某种持久缓存,例如嵌入式数据库。除了 NFS 之外,您还可以查看其他一些访问方法,例如提供来自远程主机的批量文件信息的自定义 Web 服务。

    【讨论】:

    • 谢谢!最终,我认为 JDK 7 还不错。我可以用我正在编写的工具保留二进制文件,它很快就会成为生产级软件。
    【解决方案2】:

    是的,stat() 在所有调用和库下。这是一个延迟问题。但是,您可以一次执行多个 stat(),因为有许多 NFS 服务器守护程序来支持您的连接,使用线程,除非有人袖手旁观异步 stat()!如果您可以像使用 ssh 一样登录主机,那么 stat() 会便宜得多。您甚至可以编写一个 tcp 服务来输入路径并输出 stat()。不幸的是,很难或不可能访问 NFS 服务器,因为它可能只有管理员帐户,例如 Hitachi SAN 或其他。

    【讨论】:

    • 了解一点历史背景:所讨论的 NFS 服务器是一个 5-10PB 的 Isilon 集群,它在统计调用上提供了严格的一致性,但代价是在争用下存在可怕的延迟。 (我仍然不确定他们是否有一个大锁或更复杂的东西。)这是一个文件系统级别的问题:我们没有以 root 身份进行更好的 sshed。我们最终只是让它慢慢来,而不是花费几天的时间来节省几天的计算机时间。
    猜你喜欢
    • 1970-01-01
    • 2015-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-16
    • 1970-01-01
    • 1970-01-01
    • 2016-02-28
    相关资源
    最近更新 更多