Skip to content

Latest commit

 

History

History
71 lines (49 loc) · 3.73 KB

Binary_Rule_File_pl.md

File metadata and controls

71 lines (49 loc) · 3.73 KB

Przechowywanie i ładowanie pliku GRB.

Binary_Rule_File_cn Binary_Rule_File_de Binary_Rule_File_en Binary_Rule_File_id Binary_Rule_File_pl

About | Tutorial | Rule Engine | GRL | GRL JSON | RETE Algorithm | Functions | FAQ | Benchmark


Podczas ładowania dużej ilości (setek) reguł w skrypcie GRL do KnowledgeLibrary, np. po uruchomieniu silnika, można zauważyć, że ładowanie może zająć trochę czasu, czasami nawet kilka minut. Wynika to z parsowania składni przez ANTLR4. Nie zrozum mnie źle, ANTLR jest świetnym narzędziem i bardzo dobrze wykonuje swoją pracę. Ale oczywiście dziesiątki tysięcy linii w pliku skryptowym to nie lada wyzwanie dla każdego narzędzia parsującego.

Chodzi więc o to, aby wszystkie reguły przechowywać w pliku binarnym. Dzięki temu następnym razem załaduje się on szybciej. Zupełnie jak kompilator. Kompilujesz swój tekstowy skrypt GRL, a rezultatem jest plik binarny (GRB), który ładuje się 10 razy szybciej.

Przebieg pracy jest następujący: Jako autor reguł nadal pracujesz w tekstowym skrypcie GRL. Gdy chcesz opublikować swój zbiór reguł, możesz go "skompilować" do pliku binarnego GRB. Następnie przesyłasz GRB na swój serwer, a serwer ładuje się z GRB.

Przechowywanie bazy wiedzy w GRB

Po pierwsze, powinieneś mieć KnowledgeLibrary zawierającą KnowledgeBase, którą chcesz przechowywać w GRB. Zwykle ładuje się GRL do biblioteki w następujący sposób :

	lib := ast.NewKnowledgeLibrary()
	rb := builder.NewRuleBuilder(lib)
	err := rb.BuildRuleFromResource("HugeRuleSet", "0.0.1", pkg.NewFileResource("HugeRuleSet.grl"))
	assert.NoError(t, err)

Po drugie, można teraz zapisać bazę wiedzy w GRB w następujący sposób:

	f, err := os.OpenFile("HugeRuleSet.grb", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
	assert.Nil(t, err)

	// Save the knowledge base into the file and close it.
	err = lib.StoreKnowledgeBaseToWriter(f, "HugeRuleSet", "0.0.1")
	assert.Nil(t, err)
	_ = f.Close()

Plik GRB zawiera teraz wszystkie reguły z określonej bazy wiedzy i jest gotowy do załadowania w przyszłości.

Tak, rozmiar pliku GRB jest 10-krotnie większy niż GRL, ale najczęściej dzieje się tak, gdy kompilujesz jakiś skrypt do jego postaci binarnej. (.java vs .class, .c vs .exe, go vs executable)

Ładowanie GRB do Biblioteki Wiedzy

Ładowanie GRB jest znacznie prostsze. Nie potrzeba konstruktora.

	lib := ast.NewKnowledgeLibrary()

	// Open the existing safe file
	f, err := os.Open("HugeRuleSet.grb")
	assert.Nil(t, err)

	// Load the file directly into the library and close the file
	// btw, you should not use the blueprint_kb in your engine execution.
	bluerint_kb, err := lib.LoadKnowledgeBaseFromReader(f2, true)
	assert.Nil(t, err)
	_ = f.Close()

Proszę bardzo!!!, GRB jest załadowana do KnowledgeLibrary Możesz normalnie uzyskać bazę wiedzy.

    kb := lib.NewKnowledgeBaseInstance("HugeRuleSet", "0.0.1")

Jedna rzecz, jeśli KnowledgeLibrary zawiera już taką samą bazę wiedzy jak ta w GRB, ta KnowledgeBase w bibliotece zostanie nadpisana.