Что я могу указать для среднего значения при созданиихроники, если это класс? [Хроника-Map] - PullRequest
0 голосов
/ 10 марта 2020

У меня есть следующий класс, который я хочу использовать в качестве значения для карты, которую я реализую:

import java.util.ArrayList;
import java.util.List;
import net.openhft.chronicle.bytes.BytesMarshallable;
import org.apache.commons.lang3.tuple.Pair;


public class GlossesLexicalizations implements BytesMarshallable {

    List<String> glosses = new ArrayList<String>();
    List<Pair<String, POS.Tag>> lexicalizations = new ArrayList<Pair<String, POS.Tag>>();

    public GlossesLexicalizations(){

    }

    public GlossesLexicalizations(List<String> g, List<Pair<String, POS.Tag>> l){
        glosses = g;
        lexicalizations = l;
    }

    public void setGlosses(List<String> l){
        glosses = l;
    }

    public void setLexicalizations(List<Pair<String, POS.Tag>> l){
        lexicalizations = l;
    }

    public List<String> getGlosses(){
        return glosses;
    }

    public List<Pair<String, POS.Tag>> getLexicalizations(){  
        return lexicalizations;
    }
}

Я реализую BytesMarshallable, чтобы ChronicleMap мог использовать его.

Затем я создаю базу данных:

        File file = new File("/home/sandor/Desktop/lexicalizations-and-glosses-map.bin");

        String key = "bn:14232961n"; // example

        List<String> glosses = bn.getGlosses(key, ULocale.US);

        List<Pair<String, POS.Tag>> lexicalizations = bn.getLexicalizations(key, ULocale.US);

        ChronicleMap<String, GlossesLexicalizations> lexicalizationGraph = ChronicleMap
                .of(String.class, GlossesLexicalizations.class)
                .name("lexicalizations-and-glosses")
                .constantKeySizeBySample("bn:14271053n")
                .entries(100) // poner number of entries + 15% extra
                .createOrRecoverPersistedTo(file);

        GlossesLexicalizations gl = new GlossesLexicalizations(glosses, lexicalizations);


        lexicalizationGraph.put(key, gl);

        lexicalizationGraph.close();

Это дает мне следующую ошибку:

Value size in serialized form must be configured in ChronicleMap, at least approximately. Use builder.averageValue()/.constantValueSizeBySample()/.averageValueSize() methods to configure the size

Я могу понять средний размер значения для строки, но что вы делаете для класса

1 Ответ

1 голос
/ 16 марта 2020

Вы можете либо создать объект вашего класса значений GlossesLexicalizations, заполнить его так же, как в реальном приложении, и дать его в качестве образца для averageValue(), либо вы можете приблизительно угадать, сколько данных вы будете иметь в своем объекте и использовать averageValueSize() с этим номером. Не волнуйтесь, если число не точное - оно просто должно быть в поле. Это необходимо для того, чтобы Chronicle Map могла распределять объекты в памяти (как вы, вероятно, знаете, Chronicle Map хранит объекты в памяти вне кучи, следовательно, она сама должна распределять память).

...