2

在运行以下 Java 代码时,我遇到了一个有趣的问题:

    File.createTempFile("temp.cnt.ent", "cnt.feat.tmp", directory);

抛出以下异常:

    Exception in thread "main" java.io.IOException: Identifier removed
    at java.io.UnixFileSystem.createFileExclusively(Native Method)
    at java.io.File.checkAndCreate(File.java:1704)
    at java.io.File.createTempFile(File.java:1792)

我以前从未遇到过这个问题,而且谷歌似乎对我没有太多帮助。系统运行Scientific Linux release 5.8(Linux 2.6.18-274.3.1.el5 x86_64),Java版本为

java version "1.6.0_24"
Java(TM) SE Runtime Environment (build 1.6.0_24-b07)
Java HotSpot(TM) 64-Bit Server VM (build 19.1-b02, mixed mode)

文件系统 (Lustre) 有 80TB 的可用空间。

非常感谢任何建议。

4

3 回答 3

0

你看到了一个 EIDRM。至少错误消息看起来像这样。IOException 包装了来自底层本机库的错误消息。

这不是您问题的真正答案,但可能是一个有用的提示。

http://docs.oracle.com/cd/E19455-01/806-1075/msgs-1432/index.html有一些信息和额外的指针。

于 2013-01-29T21:18:10.970 回答
0

该问题似乎与一次拥有太多应用程序实例(每个都在单独的 VM 中)有关。由于某些未知原因,操作系统拒绝允许创建临时文件。解决方法:运行更少的实例。

于 2013-03-05T16:38:54.590 回答
0

您在各种实例之间遇到同步错误。Lustre 不支持文件锁定,这可能是java.io.UnixFileSystem.createFileExclusively用来避免并发问题的。(我说“可能”是因为它似乎没有在任何地方记录。)

如果不锁定,文件操作相互干扰只是时间问题。减少实例的数量并不是一个解决方案,因为它只会降低它发生的可能性。

我相信解决方案是确保每个实例在不同的子目录中创建文件

于 2013-03-06T12:35:31.607 回答