java - 读取大文件并保留这些记录以供处理

标签 java performance file collections

这可能是重复的问题,因为我们可以找到很多页面。 但我仍然需要一些专家意见。

我需要读取一个包含客户记录姓名、年龄、收入的大文件。

我需要在我的应用程序中快速处理这些数据,并创建一个仪表板,例如类似年龄的员工、收入群体(范围之间)... 现在的挑战是读取大文件(我明确地将程序堆设置为 512 MB)并使用 InputStream、Scanner 类(根据我的理解,这些类不会将整个文件加载到内存中,如果错误,请纠正我)。所以我能够读取包含 7590912 条记录的文件(250 MB 文件)。但在我的 arrayList <Employee> 中设置这些记录时显示出持续的峰值和垃圾收集器 Activity (这是预期的)。现在为了减少我的 Employee 对象,我只创建了三个字段 [name(char[])、age[int]、invenue[float])。

最后我的程序非常慢并且无法接受。除了增加内存之外,任何提高性能的建议(请记住,我将对集合执行更多操作)。

EDIT- Using H2 database to flush the read data from file. created batch of 10000 records (still memory is 512 MB) ..but program is pathetically slow. but manage to alive for some time(till 300K records).. (utilized space 470 MB).

迂腐

最佳答案

当您读取一条记录或一定数量的记录时,您需要将它们写入数据库之类的地方,这样它们就不会保留在内存中。即使扫描仪或您使用的其他任何东西不会强制将值保留在内存中,但如果您将它们存储在列表中,那么它们就会保留在内存中,因为它们将在您的列表中。 Spring Batch 框架非常适合解决这个问题。

如果您不愿意合并框架,那么您将需要自己做大量的管道工作。我建议读入 1000 条记录,然后将它们写出来。清除您的列表,然后读取接下来的 1000 个。将一次读入的记录数设置为一个变量,以便您可以使用不同的值。 Spring Batch 将其称为 block 。

关于java - 读取大文件并保留这些记录以供处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34235696/

相关文章:

java - 使用 XPath 处理 XML 文件生成的路径时出错

java - String 数组的每个元素都包含 null

html - 将第三方 JS 和 CSS 库与我的项目 Assets 打包在一起有好处吗?

java - 无法使用 JAVA 中的网络将文件从一台电脑传输到另一台电脑

java - 错误 : com. jayway.maven.plugins.android.generation2 :android-maven-plugin:3. 6.0:generate-sources

java - 我在一种方法中创建一个对象,并尝试在其他方法中使用它

java - 使用 sun.misc.Unsafe,从 Direct ByteBuffer 扫描字节的最快方法是什么?

python - 在python中有效地知道两个列表的交集是否为空

c - 使用fread()函数读取txt文件

c - 用 C 打开并读取 "large"gzip 压缩文件