【问题标题】:Trying to read some bytes from a big text file java试图从一个大文本文件java中读取一些字节
【发布时间】:2016-12-06 06:03:21
【问题描述】:

我需要从 700MB 的文件中读取几个字节(比如 1 MB、2 MB...)。

我尝试了几种方法,但我都得到了:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

我尝试使用 JDK 8 流:

try (Stream<String> lines = Files.lines(Paths.get("myfilename"),
                                        Charset.defaultCharset())) {
    lines.forEachOrdered(line -> doSomething(line));
}

并且还使用InputStream / OutputStream:

    InputStream is = new FileInputStream("myfilename");
    ByteArrayOutputStream result = new ByteArrayOutputStream();
    byte[] buffer = new byte[1024];
    int length;
    while ((length = is.read(buffer)) != -1) {
        result.write(buffer, 0, length);
    }
    is.close();
    return result.toString("UTF-8");

我有什么遗漏吗? 谢谢!

是的,它是二进制文件。所以这就是问题所在……我怎样才能读到其中的一部分?

【问题讨论】:

  • 这有点奇怪。而且您确定没有其他代码没有显示给我们尝试一次打开整个文件?最坏的情况:尝试使用分析器来了解您的内存将去向......
  • 你到底想达到什么目的?在这里你会得到一个 OOME,因为你显然将整个文件加载到了不适合分配给你 JVM 的内存的内存中
  • 您是否有机会读取二进制文件?延迟流式传输的Files.lines () 只能用于文本文件,因为行尾由特定于平台的行分隔符确定。如果您尝试以这种方式加载二进制文件,它可能会读取直到第一个行尾序列的所有字节,如果它存在的话(前提是不发生字符集转换错误)。因此,它可能会在第一行抛出 OoME。
  • 您的第二个示例不起作用,因为您将文件保存到 ByteArrayOutputStream 并且您没有足够的内存。如果你使用文件输出流,你的第二个例子肯定会工作
  • 我编辑了这个问题。是的,是二进制文件

标签: java text binary out-of-memory heap-memory


【解决方案1】:

在 32 位模式下使用 JVM,可分配的最大堆大小为 1280 MB。所以,如果你想超越这个,你需要在 64 模式下调用 JVM。

尝试使用选项进行 java 执行:

xms = 分配的最小内存

xmx = 分配的最大内存

JVM_ARGS="-d64 -Xms1024m -Xmx15360m "
jdk1.X/bin/java $JVM_ARGS -jar myprogram.jar

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-13
    • 2013-07-09
    • 2013-12-24
    • 2021-07-15
    • 1970-01-01
    • 1970-01-01
    • 2017-10-02
    • 1970-01-01
    相关资源
    最近更新 更多