【问题标题】:temp files in memory in java programjava程序内存中的临时文件
【发布时间】:2011-06-28 12:54:28
【问题描述】:

有没有办法强制在内存中创建在 java 程序中的临时文件?由于我使用了几个大的 xml 文件,这样我会有优势吗?我是否应该使用一种透明的方法,让我不会扰乱现有的应用程序。

更新:我正在查看源代码,我注意到它使用需要这些文件路径的库(我无法更改)...

谢谢

【问题讨论】:

  • JDK7 中的“更多 NIO 功能”允许您提供自己的文件系统实现(但不适用于旧文件 API)。

标签: java performance memory large-files temporary-files


【解决方案1】:

我能想到的唯一方法是创建一个 RAM 磁盘,然后将系统属性 java.io.tmpdir 指向该 RAM 磁盘。

【讨论】:

  • 你知道在linux上怎么做吗?
  • 就我而言,这是唯一可行的解​​决方案(实际上是一个技巧),即使它与 java 没有密切关系。谢谢
  • @Lyther:在我的计算机上,我的整个/tmp 是 tmpfs,即存储在 RAM 中(必要时可以换出)。如果你的内存不足,你也可以使用compressed swap
【解决方案2】:

您可能可以强制使用一些反射魔术来强制java.io.File 的默认行为,但我确定您不想这样做,因为它会导致无法预料的行为。您最好提供一种机制,可以在常规行为和内存行为之间切换,并通过此机制路由所有调用。

看看this example,它展示了如何使用文件API来创建内存文件。

【讨论】:

  • 我所说的反射魔法是指本演示文稿中的技巧:javaspecialists.eu/talks/oslo09/ReflectionMadness.pdf - 我认为这是非常危险的,应该不惜一切代价避免。
  • 内存映射文件io和内存存储一样,只是让设备上的文件看起来像内存,差别很大。
【解决方案3】:

假设您可以控制用于写入文件的流 -

您绝对想要内存中的行为吗?如果您只想减少写入磁盘的系统调用次数,您可以将 FileOutputStream 包装在 BufferedOutputStream(具有适当大的缓冲区大小)中并写入此 BufferedOutputStream(或 BufferedWriter)而不是直接写入原始 FileOutputStream。
(这确实需要对现有应用程序进行更改)

【讨论】:

    【解决方案4】:

    XML 只是一个String,为什么不只是在内存中引用Strings,我认为File 接口是一种干扰。如果您需要操作数据,请使用StringBuilder。如果您需要线程安全,请使用StringBuffer。如果您有数量不定需要使用键查找的内容,请将它们放在类型安全的 Map 中。

    如果您绝对必须保留File 接口,则创建一个包装ByteArrayOutputStreamByteArrayInputStreamInMemoryFileWriter 以将它们保存在内存中,但我再次认为整个File 在内存中是一个如果您只想将内容缓存在内存中,这是一个糟糕的决定,如果使用简单的 String 就可以做到这一点。

    【讨论】:

    • byte[] 或类似名称 (ByteBuffer)。 XML 可以指定它在哪种字符编码中,这意味着它确实需要以字节存储。
    • 不是真的,Java 字符串是 Unicode,所以编码没有问题,特别是因为显然应用程序正在生成 XML(因此是临时文件解决方案),而不是从其他地方读取它。
    【解决方案5】:

    如果没有必要,不要使用文件。考虑来自 Guava 的 com.google.common.io.FileBackedOutputStream

    一个 OutputStream,它开始缓冲到字节数组,但一旦数据达到可配置的大小,就会切换到文件缓冲。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-01
      • 2015-05-12
      • 2011-02-23
      • 1970-01-01
      • 2010-11-04
      • 2011-10-20
      相关资源
      最近更新 更多