当前位置: 首页 > 面试题库 >

Java中巨大的file.txt的排序行

商泽宇
2023-03-14
问题内容

我正在处理一个很大的文本文件(755Mb)。我需要对行进行排序(大约1890000),然后将它们写回到另一个文件中。

问题是我无法将行存储在内存中的集合中,因为我收到了Java堆空间异常(即使我最大程度地扩展了它)。(已经尝试过!)

我不能用excel打开它并使用排序功能,因为文件太大并且无法完全加载。

我考虑过使用数据库..但是我认为编写所有行然后使用SELECT查询就执行时间而言太长了。我错了吗?

任何提示表示赞赏,谢谢


问题答案:

我认为这里的解决方案是使用临时文件进行合并排序:

  1. 读取第一个文件的前 n 行,( n 是您可以负担的存储量和在内存中排序的行数),对它们进行排序,然后将其写入文件1.tmp(或调用它)。对接下来的 n 行进行同样的操作,并将其存储在中2.tmp。重复直到处理完原始文件的所有行。

  2. 读取每个临时文件的第一行。确定最小的一个(根据您的排序顺序),将其写入目标文件,然后从相应的临时文件中读取下一行。重复直到所有行都已处理。

  3. 删除所有临时文件。

只要您有足够的磁盘空间,此方法就可以处理任意大文件。



 类似资料:
  • 问题内容: 要求 :我有一个.gz格式的Json文件。因此,压缩后的大小约为500 MB。当我提取它时,json文件几乎变成了大约10 GB。提取的JSON文件逐行包含单个JSON对象。我想要的是使用任何bash脚本或python程序基于字段对文件进行排序。 由于文件太大,因此不建议将其加载到内存中。因此,我使用了gzcat和cat bash命令来流式传输JSON数据,然后将它们通过管道传输到jq

  • 在Java中分配堆外内存时(例如通过直接缓冲区或JNI本机代码),如果JVM使用-XX: UseLargePages,分配的内存是否会由巨大的页面支持?

  • 问题内容: 我想读取一个非常大的文件的最后n行,而不使用Java将整个文件读入任何缓冲区/内存区域。 我环顾了JDK API和Apache Commons I / O,但无法找到适合此目的的一个。 我在想UNIX中使用tail或更少的方式。我认为他们不会加载整个文件,然后显示文件的最后几行。在Java中也应该有类似的方法。 问题答案: 如果使用,则可以使用和到达文件末尾附近的特定点,然后从那里开始

  • 我正在尝试读取一个大的XLSX文件。Excel文件大约有500k行,我需要读col 2。 它一直打印到第39723行,然后抛出以下异常 main.java:484=If(!cell.getStringCellValue().ToString().trim().IsEmpty())如果我删除该行并只打印行号,就可以正常工作。我需要帮助如何获得col2的字符串值。

  • 我有一个ArrayList of String。 在每个索引上的外部ArrayList中,每个内部ArrayList有四个项目,有四个参数。 联系人ID 联系人姓名 联系地址 联系号码 现在,我想根据Contact Name参数对的完整ArrayList进行排序。 意味着我要访问外部Arraylist,外部Arraylist的每个索引上存在的内部Arraylist应该根据联系人名称进行排序。 比较

  • 有没有办法在java中对Properties对象进行排序? 我有一个字符串,用于对属性进行分组,并检查数据是否以映射格式可用。