Java读取600万行的txt文件,内存溢出解决方案

这篇具有很好参考价值的文章主要介绍了Java读取600万行的txt文件,内存溢出解决方案。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

可能造成内存溢出的原因:

  1. 一次性把txt文件读取到内存
  2. 频繁的new对象

实体类


import lombok.Data;
import java.io.Serializable;

/**
 * @author cpf
 * @date 2024/4/13 14:40
 */
@Data
public class User implements Serializable{

    private String user;

    private String positioningTime;

    private String latitude;

    private String longitude;

    private String locationId;

    public void clear() {
        setUser(null);
        setPositioningTime(null);
        setLatitude(null);
        setLongitude(null);
        setLocationId(null);
    }
}

可以使用对象池解决频繁new对象的问题
解决一次性把文件读取到内存: 可以使用文件流方式,使用java.util.Scanner类扫描文件的内容,一行一行连续地读取文章来源地址https://www.toymoban.com/news/detail-850883.html



import org.example.entity.User;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.*;

/**
 * @author cpf
 * @date 2024/4/13 15:45
 */
public class TestMe {

    private static final int USER_POOL_SIZE = 100; // 根据实际情况调整对象池大小

    private static Queue<User> userPool = new LinkedList<>();

    static {
        // 预先创建对象池中的User实例
        for (int i = 0; i < USER_POOL_SIZE; i++) {
            userPool.offer(new User());
        }
    }

    public static void main(String[] args) {
     
        String filePath = "src/main/resources/Gowalla_totalCheckins.txt";
        List<User> users = readData(filePath);
        for (int i = 0; i < 20; i++) {
            // 获取一个1-6000000的随机数
            int random = (int) (Math.random() * 6000000);
            System.out.println("第"+ random +"个数据: " + users.get(random));
        }
        System.out.println(users.size());


    }

    private static List<User> readData(String filePath) {
        List<User> userList = new ArrayList<>();
        FileInputStream fis  = null;
        Scanner sc = null;
        try {
            fis = new FileInputStream(filePath);
            sc = new Scanner(fis, "UTF-8");
            while (sc.hasNextLine()) {
                String line = sc.nextLine();
                User user = parseLine(line);
                if (user != null) {
                    userList.add(user);
                }
                // 在主程序中,使用完User对象后应将其归还到对象池
                userPool.offer(user);
            }
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } finally {
            try {
                fis.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
            if (sc != null) {
                sc.close();
            }
        }


        return userList;
    }


    private static User parseLine(String line) {
        String[] data = line.split("\t");
        if (data.length < 5) {
            System.err.println("数据格式错误:需要至少包含5个字段。");
            return null;
        }
        // 从对象池中获取一个User实例
        User user = userPool.poll();
        if (user == null) {
            // 对象池为空时,创建新的User实例
            user = new User();
        }
        // 清除原有数据并填充新行数据
        user.clear();
        user.setUser(data[0]);
        user.setPositioningTime(data[1]);
        user.setLatitude(data[2]);
        user.setLongitude(data[3]);
        user.setLocationId(data[4]);

        return user;
    }


}

到了这里,关于Java读取600万行的txt文件,内存溢出解决方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java读取并解析txt文件

    利用org.json即可实现 先利用IO流读取txt文件,读取每行内容并转为普通字符串(json形式的格式一定要正确),再将其转为JSONObject对象,通过JSONObject对象来取不同类型的值。 txt文件内容格式如下: 代码如下(示例): 如果txt文件的格式不符合json格式要求的话,会在JSONObjec

    2024年02月16日
    浏览(41)
  • Java 内存溢出(二)使用 MAT 分析 .hprof 内存映像文件

    .hprof 文件: 是 java 项目的 Heap Dump 文件,也叫内存映像文件、内存快照文件,可以存放一个 java 进程在某个时间点的内存快照。生成 Heap Dump 文件的方式有两种:一是使用 jmap 命令手动导出,二是启动脚本中添加 -XX:+HeapDumpOnOutOfMemoryError 参数自动导出。本文中只涉及第二种。

    2023年04月08日
    浏览(60)
  • 开发笔记之:文件读取值溢出bug分析(JAVA版)

    (1)引言  以下是Java读取数据文件(FileInputStream)的代码:  其意图很简单:从当前游标位置读取一个双字(4字节)数据。 稍微复杂一点的就是一个字节序的考虑。 (2)问题  该代码做UT(单元测试)时,遇到了读取中断的问题(就是文件还没读取完就提前中断了)。

    2024年02月05日
    浏览(55)
  • 【Java流式下载大文件,避免OOM内存溢出】

    Java下载文件时,如果是小文件的下载,我们一般直接使用工具类的方法,比如cn.hutool.http.HttpUtil.downloadFile()。但是如果是大文件的下载,使用这些工具类的方法,可能会出现Out of Memory内存溢出,它是指需要的内存空间大于系统分配的内存空间,oom后果就是项目程序crash,Hpr

    2024年02月11日
    浏览(44)
  • python读取文件指定行的三种方法

    在python中如果要将一个文件完全加载到内存中,通过file.readlines()即可,但是在文件占用较高时,我们是无法完整的将文件加载到内存中的,这时候就需要用到python的file.readline()进行迭代式的逐行读取: 这里我们的实现方式是先用一个with语句打开一个文件,然后用readline()函数

    2024年04月28日
    浏览(38)
  • Java中的内存泄露、内存溢出与栈溢出

    大家好,我是欧阳方超。本次就Java中几个相似而又不同的概念做一下介绍。内存泄漏、内存溢出和栈溢出都是与内存相关的问题,但它们之间有所不同。 我们经常会遇到内存泄漏、内存溢出和栈溢出等问题,这些问题都与内存的使用有关。 内存泄漏(memory leak)指的是程序

    2024年02月03日
    浏览(60)
  • Python读取txt文件

    Python是一种流行的编程语言,提供了许多处理文件的功能。在Python中,我们可以使用内置的文件操作函数来读取和处理文本文件,包括读取txt文件。本文将介绍如何使用Python读取txt文件,并提供相应的源代码。 打开文件 要读取一个txt文件,首先需要使用Python的内置函数 ope

    2024年02月06日
    浏览(39)
  • Android 读取Txt文件内容

    View Code 一个获取InputStream中字符串内容的方法:传入一个InputStream,返回其中的文本内容。 View Code 以gbk编码读取内容,不同的文本文件可能编码不同,如果出现乱码,可能需要调整编码。 手机测试有安卓版本限制、生产厂家限制,如:某OS

    2024年02月17日
    浏览(37)
  • 堆内存溢出自动生成DUMP文件

    如果发生了内存泄露,如果好重现,使用JVisualvm,或者jmap,Jprofiler进行Heap Dump,使用MAT进行分析。但不好重现的话,可以打开JVM的HeapDumpOnOutOfMemoryError参数,待到有了Heap Dump再使用MAT等工具分析。 说明: 通过jvm参数-XX:+HeapDumpOnOutOfMemoryError可以让JVM在出现内存溢出时候Dump出当前

    2024年02月16日
    浏览(29)
  • python中读取文本文件txt

    文件创建 如果文件不存在就是创建,如果文件存在就是打开操作 文件对象创建 文件读 以下的函数都是文件对象的成员函数 read() 一次性读取文件的所有内容放在一个大字符串中,即存在内存中 readline() 逐行读取文本,结果是一个list readlines() 一次性读取文本的所有内容,结

    2024年02月05日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包