为什么InputStream.readObject需要花费大量时间来读取序列化的Object

时间:2014-05-07 00:19:51

标签: java performance serialization full-text-search

您好我正在尝试在java中实现向量空间模型。我使用td-idf索引了大约1000个文档,我使用这个索引来搜索文档。

我认为我用于索引的类的构造函数花费了太多时间,所以我决定序列化并将创建的对象写入文本文件,如indexedFiles.txt

所以现在我每次想要搜索到这个

的集合时都会阅读文本文件
  fileInputStream = new FileInputStream("indexedFiles.txt");
  ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
  VSM vsm = (VSM) objectInputStream.readObject();//This statement take the most time ,
  objectInputStream.close();

但是readObject和cast语句与原始构造函数大致相同。

为什么会这样? ,我这样做的原因是我想离线编制索引,以便快速搜索

3 个答案:

答案 0 :(得分:14)

fileInputStream = new FileInputStream("indexedFiles.txt");
ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);

BufferedInputStreamFileInputStream之间使用ObjectInputStream.进行尝试。这会将I / O系统调用减少8倍。

我在实践中发现,它将使用1,000,000件物品的ArrayList<>反序列化的时间从213秒减少到9秒。

答案 1 :(得分:0)

Java对象反序列化非常耗费资源。使用其他序列化方法通常是个好主意。

Java序列化不适用于存储。将索引存储为XML将为存储的数据提供更多抽象。在这种情况下,这是反对使用Java序列化的另一个观点。

尝试使用JAXB从XML文件中解组对象。

Kryo序列化似乎是一个非常注重绩效的项目。但是,我会建议您使用JAXB,因为我认为它是一个非常可靠的项目。 JAXB不是最容易使用的方式,但绝对值得学习。

答案 2 :(得分:-1)

将byte []转换为ObjectInputStream时,对我有用的是以下内容。

byte[] data = ...
InputStream inputStream = new ByteArrayInputStream(data);
ObjectInputStream objInStream = new ObjectInputStream(inputStream);
ReceiveBuffer reBuffer = (ReceiveBuffer)objInStream.readObject();

这比使用ByteArrayInputStream或BufferedInputStream作为ObjectInputStream的源快得多。