我的 Java 程序读取一个大文本文件时内存不足,有人能帮忙解释一下为什么吗?

2024-04-08

我有一个包含 2000 万行文本的大型文本文件。当我使用以下程序读取文件时,它工作得很好,事实上我可以读取更大的文件而不会出现内存问题。

public static void main(String[] args) throws IOException {
    File tempFile = new File("temp.dat");
    String tempLine = null;
    BufferedReader br = null;
    int lineCount = 0;
    try {
        br = new BufferedReader(new FileReader(tempFile));
        while ((tempLine = br.readLine()) != null) {
            lineCount += 1;
        }
    } catch (Exception e) {
        System.out.println("br error: " +e.getMessage());
    } finally {
        br.close();
        System.out.println(lineCount + " lines read from file");
    }
}

但是,如果我需要在读取该文件之前附加一些记录,BufferedReader 会消耗大量内存(我刚刚使用 Windows 任务管理器来监视这一点,我知道这不是很科学,但它说明了问题)。修改后的程序如下,与第一个程序相同,只是我先向文件附加一条记录。

public static void main(String[] args) throws IOException {
    File tempFile = new File("temp.dat");
    PrintWriter pw = null;
    try {
        pw = new PrintWriter(new BufferedWriter(new FileWriter(tempFile, true)));
        pw.println(" ");
    } catch (Exception e) {
        System.out.println("pw error: " + e.getMessage());
    } finally {
        pw.close();
    }

    String tempLine = null;
    BufferedReader br = null;
    int lineCount = 0;
    try {
        br = new BufferedReader(new FileReader(tempFile));
        while ((tempLine = br.readLine()) != null) {
            lineCount += 1;
        }
    } catch (Exception e) {
        System.out.println("br error: " +e.getMessage());
    } finally {
        br.close();
        System.out.println(lineCount + " lines read from file");
    }
}

Windows 任务管理器的屏幕截图,其中线条中的大凸起显示了我运行该程序的第二个版本时的内存消耗。

所以我能够读取这个文件而不会耗尽内存。但是我有更大的文件,有超过 5000 万条记录,当我对它们运行这个程序时,会遇到内存不足的异常吗?有人可以解释为什么该程序的第一个版本在任何大小的文件上都可以正常工作,但第二个程序的行为却如此不同并以失败告终?我在 Windows 7 上运行:

java版本“1.7.0_05”
Java(TM) SE 运行时环境(版本 1.7.0_05-b05)
Java HotSpot(TM) 客户端 VM(内部版本 23.1-b03,混合模式,共享)


你可以启动一个Java虚拟机VM选项 http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html

-XX:+HeapDumpOnOutOfMemoryError

这会将堆转储写入文件,可以分析该文件以查找泄漏嫌疑人

使用“+”添加选项,使用“-”删除选项。

如果您使用 Eclipse Java 内存分析器插件MAT http://www.eclipse.org/mat/从正在运行的虚拟机中获取堆转储,并对泄漏嫌疑人等进行一些很好的分析。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我的 Java 程序读取一个大文本文件时内存不足,有人能帮忙解释一下为什么吗? 的相关文章

  • 如何在日期选择器中设置不在当前月份的单元格的样式

    我目前正在为我的 JavaFX 应用程序制作注册表 问题是 当日期选择器中的单元格不在页面的月份上时 我想让该单元格变灰 让我们看看我当前的日期选择器 我的日期选择器 正如您所看到的 我希望下个月的日期 27 日 28 日 30 日以及 1
  • Java 中的 XPath 节点集

    我在 eclipse 中有这段代码 NodeSet nodes NodeSet xPath evaluate expression inputSource XPathConstants NODESET 它给我 NodeSet 上的编译时错误
  • 如果测试用例失败,Selenium Web 驱动程序无法关闭 Firefox 实例

    我各位 我正在使用 junit 和 selenium web 驱动程序 2 28 问题是 如果我运行成功的测试用例 Web 驱动器能够关闭 Firefox 实例 但是当测试用例失败时 Selenium Web 驱动器无法关闭 Firefox
  • AES 加密 Java/plsql

    我需要在Java和plsql DBMS CRYPTO for Oracle 10g 上实现相同的加密 解密应用程序 两种实现都工作正常 但这里的问题是我对相同纯文本的加密得到了不同的输出 下面是用于加密 解密过程的代码 Java 和 PLS
  • 如何测试 JUnit 测试的 Comparator?

    我需要测试 Compare 方法 但我对如何测试感到困惑 我可以看看该怎么做吗 public class MemberComparator implements Comparator
  • 线程自动利用多个CPU核心?

    假设我的应用程序运行 2 个线程 例如渲染线程和游戏更新线程 如果它在具有多核 CPU 当今典型 的移动设备上运行 我是否可以期望线程在可能的情况下自动分配给不同的核心 我知道底层操作系统内核 Android linux内核 决定调度 我的
  • Java8无符号算术

    据广泛报道 Java 8 具有对无符号整数的库支持 然而 似乎没有文章解释如何使用它以及有多少可能 有些函数 例如 Integer CompareUnsigned 很容易找到 并且似乎可以实现人们所期望的功能 但是 我什至无法编写一个简单的
  • 在数据流模板中调用 waitUntilFinish() 后可以运行代码吗?

    我有一个批处理 Apache Beam 作业 它从 GCS 获取文件作为输入 我的目标是根据执行后管道的状态将文件移动到两个 GCS 存储桶之一 如果管道执行成功 则将文件移动到存储桶 A 否则 如果管道在执行过程中出现任何未处理的异常 则
  • Convert.FromBase64String 方法的 Java 等效项

    Java 中是否有相当于Convert FromBase64String http msdn microsoft com en us library system convert frombase64string aspx which 将指
  • java中删除字符串中的特殊字符?

    如何删除字符串中除 之外的特殊字符 现在我用 replaceAll w s 它删除了所有特殊字符 但我想保留 谁能告诉我我该怎么办 Use replaceAll w s 我所做的是将下划线和连字符添加到正则表达式中 我添加了一个 连字符之前
  • Java中接口作为方法参数

    前几天去面试 被问到了这样的问题 问 反转链表 给出以下代码 public class ReverseList interface NodeList int getItem NodeList nextNode void reverse No
  • Spring Data 与 Spring Data JPA 与 JdbcTemplate

    我有信心Spring Data and Spring Data JPA指的是相同的 但后来我在 youtube 上观看了一个关于他正在使用JdbcTemplate在那篇教程中 所以我在那里感到困惑 我想澄清一下两者之间有什么区别Spring
  • Java中未绑定通配符泛型的用途和要点是什么?

    我不明白未绑定通配符泛型有什么用 具有上限的绑定通配符泛型 stuff for Object item stuff System out println item Since PrintStream println 可以处理所有引用类型 通
  • 使用 SAX 进行 XML 解析 |如何处理特殊字符?

    我们有一个 JAVA 应用程序 可以从 SAP 系统中提取数据 解析数据并呈现给用户 使用 SAP JCo 连接器提取数据 最近我们抛出了一个异常 org xml sax SAXParseException 字符引用 是无效的 XML 字符
  • 如何在 Maven 中显示消息

    如何在 Maven 中显示消息 在ant中 我们确实有 echo 来显示消息 但是在maven中 我该怎么做呢 您可以使用 antrun 插件
  • 当单元格内的 JComboBox 中有 ItemEvent 时,如何获取 CellRow

    我有一个 JTable 其中有一列包含 JComboBox 我有一个附加到 JComboBox 的 ItemListener 它会根据任何更改进行操作 但是 ItemListener 没有获取更改的 ComboBox 所在行的方法 当组合框
  • 将 JTextArea 内容写入文件

    我在 Java Swing 中有一个 JTextArea 和一个 提交 按钮 需要将textarea的内容写入一个带有换行符的文件中 我得到的输出是这样的 它被写为文件中的一个字符串 try BufferedWriter fileOut n
  • 休眠以持久保存日期

    有没有办法告诉 Hibernate java util Date 应该持久保存 我需要这个来解决 MySQL 中缺少的毫秒分辨率问题 您能想到这种方法有什么缺点吗 您可以自己创建字段long 或者使用自定义的UserType 实施后User
  • KeyPressed 和 KeyTyped 混淆[重复]

    这个问题在这里已经有答案了 我搜索过之间的区别KeyPressedand KeyTyped事件 但我仍然不清楚 我发现的一件事是 Keypressed 比 KeyTyped 首先被触发 请澄清一下这些事件何时被准确触发 哪个适合用于哪个目的
  • Swagger/Openapi-Annotations:如何使用 $ref 生成 allOf?

    我正在生成 Rest 端点 包括添加OpenAPI Swagger对生成的代码进行注释 虽然它对于基本类型运行得很好 但我在自定义类方面遇到了一些问题 现在我有很多自定义类的重复架构条目 使用 Schema 实现 MyClass class

随机推荐

  • php - 输出值到屏幕中间循环

    在长 foreach 循环期间是否可以将任何内容输出到屏幕 每当我执行一个需要很长时间的循环时 在循环完全完成之前 屏幕上不会输出任何内容 即使 echo 语句位于循环内部 有没有办法改变这种行为 您需要刷新缓冲区 如何执行取决于您的服务器
  • 如何在 CUDA 应用程序中构建数据以获得最佳速度

    我正在尝试编写一个简单的粒子系统 利用 CUDA 来更新粒子位置 现在 我定义的粒子有一个对象 该对象的位置由三个浮点值定义 速度也由三个浮点值定义 更新粒子时 我向速度的 Y 分量添加一个常量值以模拟重力 然后将速度添加到当前位置以得出新
  • 为什么删除不完整的类型实际上是未定义的行为?

    考虑这个经典的例子来解释什么not与前向声明有关 in Handle h file class Body class Handle public Handle Handle delete impl private Body impl in
  • JQUERY DOM:选择 Dom 加载后创建的元素

    我正在开发一个项目 在该项目中 我需要在调用函数时更改某个类的所有选择输入的值 问题是一些选择输入在 dom 首次加载时并不存在 它们是通过 Javascript 动态创建的 该函数适用于选择页面加载时存在的所有选择输入 但不适用于动态添加
  • Delphi REST API 帖子示例

    有人可以发布一个使用 Delphi 2005 向 API 发送 JSON POST 请求的简单示例 我发现了许多使用 GET 的示例 但 API 提供程序不允许通过 HTTP GET 请求 也不支持 URL 编码参数 我对调用 REST 服
  • 什么时候在排序之外使用太空船运算符?

    我只见过 Perl 宇宙飞船运算符 在数字排序例程中使用 但它在其他情况下似乎很有用 我只是想不出实际用途 什么时候可以在 Perl 排序之外使用它 This is a best practice question 我正在为机器人乔编写一个
  • App.Config 应该是应用程序的伴随文件还是放在自己的组件中?

    当我创建 Windows Installer 程序包 例如使用 WiX 并安装该应用程序时App exe以及App exe config配置文件应该有自己的组件还是应该是应用程序可执行文件的伴随文件
  • Netty 处理程序未调用

    我正在尝试使用简单的服务器客户端应用程序进入 Netty 代码见下文 我正在努力解决两个问题 ConfigServerHandler 分别ConfigClientHandler 被正确调用 但是 FeedbackServerHandler
  • 有没有办法为 Swift 4.2 随机数生成器提供种子

    我喜欢新的 Swift 4 2 RandomNumberGenerator 东西 但我没有看到那里有种子的可能性 我是否遗漏了一些东西 或者有什么方法可以通过调用底层低级函数来为这些生成器提供种子 我有很多代码 它们在默认数字类型上使用默认
  • 创建APK时Android应用程序图标变得模糊

    创建 APK 时我的应用程序图标变得模糊 我尝试下载一个具有非常尖锐图标的 Android 应用程序的 APK 并将其放入我的 APK 中 但得到了相同的结果 为什么我的图标变得模糊 而我在使用相同图标的其他应用程序中看到它却非常清晰 当然
  • 转换时我得到 LINQ to Entities Int32 ToInt32(System.String)

    当 Convert i 尝试 int Parse SqlFunction 和 EdmFunction 时 我得到 LINQ to Entities Int32 ToInt32 System String 但问题仍然存在 例外 System
  • `enforce_stop_tokens` 如何在 LangChain 中与 Huggingface 模型一起工作?

    当我们查看 HuggingFaceHub 模型的使用情况时langchain有这部分作者不知道如何停止生成 https github com hwchase17 langchain blob master langchain llms hu
  • django-social-auth 中的 Django 错误

    我是 Django 的新手 我正在我的应用程序中实现 Facebook 身份验证 我在终端输出中遇到的错误类似于 File manage py line 10 in
  • 在 Flutter 中在 X 上旋转 3D

    我一直在研究 Flutter 旋转 new Matrix4 identity rotateX degrees 3 1415927 180 但是 问题是 我希望它与下图类似 我可以用 Flutter 在 x 轴上实现类似 3D 的旋转吗 即使
  • Python中删除只读目录

    shutil rmtree不会删除 Windows 上的只读文件 有没有相当于 rm rf 的Python 为什么哦为什么这么痛苦 shutil rmtree可以采用一个错误处理函数 当删除文件时遇到问题时将调用该函数 您可以使用它来强制删
  • 无法查询 ListField(EmbeddedDocumentField)

    我有以下型号 class Skill EmbeddedDocument name StringField required True level IntField required True class Agent Document nam
  • iPhone版本兼容性扫描仪

    好吧 我开发 iPhone 应用程序已经一年多了 但有一件事仍然很糟糕 假设我想让我的应用程序与 iOS 3 0 兼容 我将 sdk 设置为可用的最新版本 并将部署目标设置为 3 0 但是 如果您不小心调用了仅在 3 1 x 或更高版本中可
  • 如何在 woocommerce 中检查产品是否有变化

    有什么方法可以检查产品是否有变化 例如 请帮我 这应该有效 if product gt is type simple No variations to product elseif product gt is type variable P
  • python 3.2: IOError: [Errno 22] 无效参数: '/home/pi/data/temp/file1\n.txt'

    我是 python 编程的新手 我有一个 counter txt 文件 我从中读取计数器值 使用此计数器值 我必须在其他文件夹中创建新文件 例如 home pi data temp file s txt line 例如 file1 txt
  • 我的 Java 程序读取一个大文本文件时内存不足,有人能帮忙解释一下为什么吗?

    我有一个包含 2000 万行文本的大型文本文件 当我使用以下程序读取文件时 它工作得很好 事实上我可以读取更大的文件而不会出现内存问题 public static void main String args throws IOExcepti