我从数据库查询获取大量数据,并且我正在制作它们的对象。我终于有了这些对象的列表(大约1M对象),我想将其序列化到磁盘供以后使用。问题是它几乎不适合在内存中并且将来不适合,所以我需要一些系统来序列化说第一个100k,下一个100k等;并以100k为增量读回数据。
我可以制作一些明显的代码来检查列表是否变得过大,然后将其设置为“list1”,然后是“list2”等,但也许有更好的方法来处理它?</ p>
答案 0 :(得分:3)
您可以浏览列表,创建一个对象,然后立即将其提供给ObjectOutputStream,然后将其写入文件。
答案 1 :(得分:2)
从数据库
不要将它们放入列表中,而是在从DB中获取文件时将它们写入文件
永远不要在RAM中保留多个对象。当您读取对象时,在readObject()
返回null
(=文件结束)时终止读取循环
答案 2 :(得分:1)
我猜您检查过,确实需要将数据保存到磁盘。它不能留在数据库中,不是吗?
要处理太大的数据,您需要将其缩小: - )
一个想法是按块获取数据:
答案 3 :(得分:1)
考虑设置JDBC驱动程序的提取大小,例如mysql的JDBC驱动程序默认提取整个结果集。
请在此处阅读以获取更多信息:fetch size
答案 4 :(得分:0)
您似乎正在从db中检索大型数据集并将其转换为对象列表并一次性将它们序列化。
不要这样做......最后它可能导致应用程序崩溃。
相反,你必须
答案 5 :(得分:0)
ObjectOutputStream可以工作,但它有更多的开销。我认为DataOutputStream/DataInputStream
是更好的选择。
只需逐个读/写,让流担心缓冲。例如,你可以做这样的事情,
DataOutputStream os = new DataOutputStream(new FileOutputStream("myfile"));
for (...)
os.writeInt(num);
对象和数据流的一个问题是write(int)只写一个字节。请使用writeInt(int)。