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

Sne*_*n27 1 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();
Run Code Online (Sandbox Code Playgroud)

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

为什么会这样?,我这样做的原因是我想离线索引,所以搜索会很快

use*_*421 16

fileInputStream = new FileInputStream("indexedFiles.txt");
ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
Run Code Online (Sandbox Code Playgroud)

尝试使用和BufferedInputStream之间的操作.这将使I/O系统调用减少8倍.FileInputStreamObjectInputStream.

我在实践中发现它减少了将ArrayList<>1,000,000个项目从213s 反序列化到9s的时间.

  • 值得一千个赞成票 - 感谢这个令人惊讶的简单解决方案! (2认同)