如何通过序列化处理和保存大文件?

Posted

技术标签:

【中文标题】如何通过序列化处理和保存大文件?【英文标题】:How to process and save big files with serialization? 【发布时间】:2016-08-22 12:46:42 【问题描述】:

我想读取一个大文件(它不能作为对象放入堆中)。我必须逐行阅读,处理每一行,然后保存(追加)到一个新文件中。

我完成了第一步(加载和处理)并在控制台上打印输出。我不创建数据对象。 我想我必须即时进行,但我不知道可能有帮助的库。

我还想添加 XML 或 CSV 序列化。 你知道一些可以解决这个问题的库吗?

for (String line; (line = bufferedReader.readLine()) != null; ) 
     String processedNewLine = processLine(Line);
     //and I would like to serialize to XML (append)
     XMLSerialiazer.serialize(processedNewLine, xmlTemp.getPath());


【问题讨论】:

你的问题已经回答过了,看这里***.com/questions/14037404/… @M.RAshouri 您链接的问题仅针对 csv 文件回答。对 XML 没有用处,因为逐行读取并不能解决问题,有时整个 xml 保存在单行中以节省空间。 您想将每个经过处理的行序列化为 XML 文件吗?为什么? 每个处理的行都应该是一个大 XML 文件的 XML 部分:<line><field1>name</field1>...</line> 【参考方案1】:

如果您使用 .csv 文件,您只需逐行阅读。没有必要使用特殊的库,您也可以毫无问题地处理非常大的文件。

如果您使用 .xml 文件,则需要 SAX parser。基本上,SAX 解析器是一种对事件(如打开标记、关闭标记)进行操作的解析器,而不是像 DOM 解析器那样在内存中构建整个结构。

【讨论】:

使用 CSV 很简单,但使用 XML 就更复杂了。最后,我将 XML 视为随机访问文件并将新行添加到末尾。它不干净,但非常快。【参考方案2】:

如果您正在寻找使用可用 XML 序列化库的替代方法,请查看来自 google 的 protocol buffers。

Tutorial

Git source

【讨论】:

【参考方案3】:

你应该看看Kryo,这是最快的序列化库之一。

【讨论】:

以上是关于如何通过序列化处理和保存大文件?的主要内容,如果未能解决你的问题,请参考以下文章

perl处理fasta文件

如何从大fasta文件中找出自己想要的序列

如何序列化对象并将其保存到 Android 中的文件中?

php文件处理与文件上传

php文件处理与文件上传

大数据系列基于MapReduce的数据处理 SequenceFile序列化文件