序列化一个非常大的列表

时间:2009-09-23 08:44:19

标签: java serialization

我从数据库查询获取大量数据,并且我正在制作它们的对象。我终于有了这些对象的列表(大约1M对象),我想将其序列化到磁盘供以后使用。问题是它几乎不适合在内存中并且将来不适合,所以我需要一些系统来序列化说第一个100k,下一个100k等;并以100k为增量读回数据。

我可以制作一些明显的代码来检查列表是否变得过大,然后将其设置为“list1”,然后是“list2”等,但也许有更好的方法来处理它?<​​/ p>

6 个答案:

答案 0 :(得分:3)

您可以浏览列表,创建一个对象,然后立即将其提供给ObjectOutputStream,然后将其写入文件。

答案 1 :(得分:2)

  1. 从数据库

  2. 逐个读取对象
  3. 不要将它们放入列表中,而是在从DB中获取文件时将它们写入文件

  4. 永远不要在RAM中保留多个对象。当您读取对象时,在readObject()返回null(=文件结束)时终止读取循环

答案 2 :(得分:1)

我猜您检查过,确实需要将数据保存到磁盘。它不能留在数据库中,不是吗?


要处理太大的数据,您需要将其缩小: - )

一个想法是按块获取数据

  • 从请求开始,因此不构建这个庞大的列表(因为这迟早会成为失败点)
  • 序列化较小的对象列表
  • 然后循环

答案 3 :(得分:1)

考虑设置JDBC驱动程序的提取大小,例如mysql的JDBC驱动程序默认提取整个结果集。

请在此处阅读以获取更多信息:fetch size

答案 4 :(得分:0)

您似乎正在从db中检索大型数据集并将其转换为对象列表并一次性将它们序列化。

不要这样做......最后它可能导致应用程序崩溃。

相反,你必须

  • 最小化从数据库中检索的数据量。 (说吧 1000条记录而不是1 M)
  • 将它们转换为业务对象
  • 序列化它们。
  • 并执行相同的程序,直到最后一条记录
通过这种方式,您可以避免性能问题。

答案 5 :(得分:0)

ObjectOutputStream可以工作,但它有更多的开销。我认为DataOutputStream/DataInputStream是更好的选择。

只需逐个读/写,让流担心缓冲。例如,你可以做这样的事情,

    DataOutputStream os = new DataOutputStream(new FileOutputStream("myfile"));
    for (...)
        os.writeInt(num);

对象和数据流的一个问题是write(int)只写一个字节。请使用writeInt(int)。