在java中将大量对象存储到磁盘的最佳方法

时间:2013-09-27 22:06:13

标签: java serialization

这是我打算存储在磁盘中的对象,

public class SObject {
    /**
     * 
     */
    private String value;
    private int occurences;
    private String key;

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public int getOccurences() {
        return occurences;
    }

    public void setOccurences(int occurences) {
        this.occurences = occurences;
    }

    public String getKey() {
        return key;
    }

    public void setKey(String key) {
        this.key = key;
    }
}

我正在考虑创建一个对象列表并将该列表存储到一个新类,如下所示

public class ToDisk implements Serializable{
        List<SObject> sobj;

    public List<SObject> getSobj() {
        return sobj;
    }

    public void setSobj(List<SObject> sobj) {
        this.sobj = sobj;
    }

}

这是一种编写数据的代码工作量最少的有效方法吗?我还发现使用序列化更容易从磁盘读取数据。因为列表的大小可能非常高(~10k +),我应该在代码的容易性和大小之间找到平衡点。有没有办法实现这种平衡?如果有任何其他方法来存储与序列化相比缩小的数据,请告诉我。我不能使用任何外部库。

2 个答案:

答案 0 :(得分:3)

BTW您不需要列表包装​​器将多个项目写入文件,但您的项目需要是Serializable。

public class SObject {
    private String value;
    private int occurences;
    private String key;
}

List<SObject> list = new ArrayList<>();

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(fileName));
oos.writeObject(list);
oos.close();

阅读

ObjectInputStream ois = new ObjectInputStream(new FileInputStream(fileName));
List<SObject> list = (List<SObject>) ois.readObject(); // cast is needed.
ois.close()

写压缩

ObjectOutputStream oos = new ObjectOutputStream(new DeflaterOutputStream(new FileOutputStream(fileName)));
oos.writeObject(list);
oos.close();

读取压缩

ObjectInputStream ois = new ObjectInputStream(new InflaterInputStream(new FileInputStream(fileName)));
List<SObject> list = (List<SObject>) ois.readObject(); // cast is needed.
ois.close()

  

这是一种编写数据的代码工作量最少的有效方法吗?

你必须制作SObject implement Serializable,这就是全部。你不能缩短它。

你可以通过implement Externalizable来提高效率,但这是更多的工作。

  

我还发现使用序列化更容易从磁盘读取数据。

这听起来是一个很好的理由。

  

因为列表的大小可能非常高(~10k +),

除非你的琴弦很长,否则10K听起来很小。我对我的序列化/ peristsence库进行了测试,它可以在几秒钟内写入并读取10,000,000个条目。

  

我应该在代码和大小之间找到平衡点。有没有办法实现这种平衡?

我怀疑你需要担心的是轻松。如果你想让文件变小,你可以通过用GZIP或deflator / inflator stream包装文件流来压缩文件。这会增加一行代码,并使文件缩小4倍。

  

与序列化相比,请告诉我是否有其他方法可以缩小尺寸存储数据。我不能使用任何外部库。

他们都需要外部库。你可以使用XMLEncoder和XMLDecoder,但这会更慢更大。


因为我有一个问题;如果您对我的库感兴趣Java Chronicle 2.x以下是我的笔记本电脑上运行测试的结果。这次写入5亿个条目并在第二个帖子中读取它们需要多长时间(因为它们正在写入)它花了超过12秒。

Rate = 41.0 Mmsg/sec for 16 byte messages

测试是IndexedChronicleTest

中的multiThreaded()

答案 1 :(得分:0)

最好的方法可能是将ArrayList序列化到磁盘。

确保列表的内容是可序列化的,即列表中的对象应实现Serializable接口。

然后
写入文件:

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(fileName));
oos.writeObject(list);
oos.flush();
oos.close();

从文件中读取:

ObjectInputStream ois = new ObjectInputStream(new FileInputStream(fileName));
List<YourClass> list = ois.readObject();
ois.close()