您好我正在尝试在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语句与原始构造函数大致相同。
为什么会这样? ,我这样做的原因是我想离线编制索引,以便快速搜索
答案 0 :(得分:14)
fileInputStream = new FileInputStream("indexedFiles.txt");
ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
在BufferedInputStream
和FileInputStream
之间使用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的源快得多。