Java - 排序和csv:大数据的良好实践

时间:2016-04-15 09:35:46

标签: java sorting csv memory-management

我需要在Java中使用几种算法订购一个巨大的csv文件(超过1000万条记录),但我对内存量有一些问题。

基本上我有一个巨大的csv文件,其中每个记录有4个字段,具有不同的类型(String,int,double)。 我需要将此csv加载到某个结构中,然后按所有字段对其进行排序。

我的想法是:编写一个Record类(带有自己的字段),逐行启动读取csv文件,为每一行创建一个新的Record对象,然后将它们放入ArrayList中。然后为每个字段调用我的分类算法。

它不起作用..当我尝试将所有Record对象加载到我的ArrayList中时,我得到了 OutOfMemoryException

通过这种方式,我创造了大量的物体,我认为这不是一个好主意。 当我拥有大量数据时,我该怎么办?哪种方法/数据结构在内存使用方面可以降低成本?

我的观点是使用排序标记并查看它们如何处理大量数据,将排序结果保存到文件中并不重要。

我知道csv有一些库,但我应该在没有外部库的情况下实现它。

非常感谢! :d

2 个答案:

答案 0 :(得分:0)

将文件剪切成碎片(取决于文件的大小)并查看合并排序。这样你甚至可以在不使用大量内存的情况下对大文件进行排序,这就是数据库在必须进行大量处理时所使用的。

答案 1 :(得分:-1)

我会在内存模式下使用内存数据库,例如h2( jdbc:h2:mem:) 因此,所有内容都保留在RAM中并且不会刷新到光盘(前提是你有足够的内存,如果没有,你可能想要使用基于文件的URL)。在那里创建表并写入csv中的每一行。如果正确设置索引,使用标准sql

将轻而易举地进行排序和分组