2013-09-27 7 views
2

Это объект, который я планирую хранить в диске,Лучший способ сохранить огромный список объектов на диск в Java

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 +), и я должен найти баланс между легкостью кода и размером. Есть ли способ достичь этого баланса? Пожалуйста, дайте мне знать, есть ли какие-либо другие способы хранения данных в уменьшенном размере по сравнению с сериализацией. Я не могу использовать внешние библиотеки.

+0

Вы не * нужно * использовать список; вы можете сериализовать несколько объектов в один файл и прочитать их в том же порядке. – arshajii

+0

Вы уверены, что вам действительно нужна не простая база данных? – Deadron

+0

@Deadron Я не могу/не должен использовать Db, просто написать файл. – NEO

ответ

2

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, но это больше работы.

Мне также легче читать данные с диска с помощью сериализации.

Звучит как повод для этого.

Поскольку размер списка может быть очень высокой (~ 10к +),

10K звучит маленький для меня, если ваши строки не очень долго. У меня есть тест для моей библиотеки сериализации/перекрестности, и он записывает и считывает 10 000 000 записей за считанные секунды.

Я должен найти баланс между простотой кода и размером. Есть ли способ достичь этого баланса?

Я подозреваю, что легкость - это все, о чем вам нужно беспокоиться. Если вы хотите уменьшить размер файла, вы можете сжать его, обернув поток файлов потоком GZIP или дефлятора/инфлятора. Это добавляет строку кода и может сделать файл на 4 раза меньше.

Пожалуйста, дайте мне знать, если есть какие-либо другие способы хранения данных в уменьшенном размере по сравнению с сериализацией. Я не могу использовать внешние библиотеки.

Все они требуют наличия внешних библиотек. Вы можете использовать XMLEncoder и XMLDecoder, но это будет медленнее и больше.


Поскольку у меня возник вопрос по этому вопросу; Если вы заинтересованы в моей библиотеке Java Chronicle 2.x Вот результат теста, проведенного на моем ноутбуке. На этот раз, сколько времени потребовалось, чтобы написать 500 миллионов записей и прочитать их во втором потоке (как они писали). Это заняло чуть более 12 секунд.

Rate = 41.0 Mmsg/sec for 16 byte messages 

Тест многопоточный() в IndexedChronicleTest

+0

* У меня есть тест для моей библиотеки сериализации/перекрестности * - в какой библиотеке это? – RandomQuestion

+2

@Jitendra Это Java Chronicle, у меня есть тесты, которые показывают запись 40 миллионов сообщений в секунду на ноутбуке, а сообщения читаются в другом процессе с задержкой 0,6 микросекунды. https://github.com/peter-lawrey/Java-Chronicle - это старая версия, а https://github.com/OpenHFT/Java-Chronicle - это более быстрая, новая и улучшенная версия. –

+0

System.out.println (objList.size()); // размер печатается \t \t попробовать { \t \t \t ObjectOutputStream OOS = новый ObjectOutputStream ( \t \t \t \t \t новый FileOutputStream ("\\ USERS \\ Naren \\ папка \\ test.txt")); \t \t \t oos.writeObject (objList); \t \t \t oos.close();} задвижка (Исключение е) { \t \t \t e.printStackTrace(); \t \t} // ошибка не возникает, но я не вижу файл. я что-то упускаю? – NEO

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() 
+2

Флеш() является избыточным. –

Смежные вопросы