nie może odtworzyć / zweryfikować twierdzeń dotyczących wydajności w bazach danych wykresów i neo4j w książkach akcji
AKTUALIZACJA Zadałem pytanie kontrolne zawierające zaktualizowane skrypty i jaśniejsze ustawieniawydajność neo4j w porównaniu z mysql (jak można ją poprawić?). Proszę kontynuować./AKTUALIZACJA
Mam pewne problemy z weryfikacją oświadczeń o wydajności przedstawionych w książce „wykresy graficzne” (strona 20) iw neo4j (rozdział 1).
Aby zweryfikować te twierdzenia, utworzyłem przykładowy zestaw 100 000 wpisów „osób” z 50 „przyjaciółmi” i próbowałem zapytać np. O przyjaciele 4 podskakują. Użyłem tego samego zestawu danych w mysql. Z przyjaciółmi przyjaciół powyżej 4 chmielumysql powraca w ciągu 0,93 sekundy, podczasneo4j potrzebuje 65 -75 sekund (przy powtarzających się połączeniach).
Jak mogę poprawić ten nędzny wynik i zweryfikować roszczenia zawarte w książkach?
Nieco więcej szczegółów:Całość instaluję na i5-3570K z 16 GB pamięci RAM, używając ubuntu12.04 64bit, java w wersji „1.7.0_25” i mysql 5.5.31, neo4j-community-2.0.0-M03 (otrzymuję podobny wynik z 1.9 )
Wszystkie dane kodu / próbki można znaleźć na stroniehttps://github.com/jhb/neo4j-experiements/ (do użycia z 2.0.0). Otrzymane przykładowe dane w różnych formatach można znaleźć na stroniehttps://github.com/jhb/neo4j-testdata.
Do korzystania ze skryptów potrzebny jest python z zainstalowanym mysql-python, request i simplejson.
zbiór danych jest tworzony za pomocą friendsdata.py i przechowywany w grupie przyjaciółprzyjaciele.pickle zostaną zaimportowane do neo4j za pomocą import_friends_neo4j.pyprzyjaciele.pickle zostaną zaimportowane do mysql przy użyciu import_friends_mysql.pyDodaje indeksy na t_user_friend. * W mysqlDodałem „utwórz indeks na: node (noscenda_name) w neo4jAby ułatwić życie przyjaciołom. *. Bz2 zawiera instrukcje sql i cypher do tworzenia tych zestawów danych w mysql i neo4j 2.0 M3.
Wydajność MySQLNajpierw rozgrzewam mysql, wysyłając zapytanie:
select count(distinct name) from t_user;
select count(distinct name) from t_user;
Potem, dla prawdziwego wysiłku, jaki robię
python query_friends_mysql.py 4 10
Spowoduje to utworzenie następującej instrukcji sql (ze zmianą t_user.names):
select
count(*)
from
t_user,
t_user_friend as uf1,
t_user_friend as uf2,
t_user_friend as uf3,
t_user_friend as uf4
where
t_user.name='person8601' and
t_user.id = uf1.user_1 and
uf1.user_2 = uf2.user_1 and
uf2.user_2 = uf3.user_1 and
uf3.user_2 = uf4.user_1;
i powtarza to 4-krotne zapytanie 10 razy. Zapytania wymagają po około 0,95 sek. Mysql jest skonfigurowany do używania klucza key_buffer 4G.
testowanie wydajności neo4jZmodyfikowałem neo4j.properties:
neostore.nodestore.db.mapped_memory=25M
neostore.relationshipstore.db.mapped_memory=250M
i neo4j-wrapper.conf:
wrapper.java.initmemory=2048
wrapper.java.maxmemory=8192
Aby rozgrzać neo4j, robię
start n=node(*) return count(n.noscenda_name);
start r=relationship(*) return count(r);
Następnie zaczynam używać transakcyjnego punktu końcowego http (ale otrzymuję te same wyniki przy użyciu powłoki neo4j).
Wciąż się rozgrzewam, biegnę
./bin/python query_friends_neo4j.py 3 10
Spowoduje to utworzenie zapytania o formularz (z różnymi identyfikatorami osób):
{"statement": "match n:node-[r*3..3]->m:node where n.noscenda_name={target} return count(r);", "parameters": {"target": "person3089"}
po siódmym połączeniu każde połączenie potrzebuje około 0,7-0,8 sek.
Teraz na prawdziwą rzecz (4 przeskoki)
./bin/python query_friends_neo4j.py 4 10
tworzenie
{"statement": "match n:node-[r*4..4]->m:node where n.noscenda_name={target} return count(r);", "parameters": {"target": "person3089"}
a każde połączenie trwa od 65 do 75 sekund.
Otwarte pytania / myśliNaprawdę chciałbym, aby roszczenia w książkach były odtwarzalne i poprawne, a neo4j szybciej niż mysql zamiast wielkości wolniej.
Ale nie wiem, co robię źle ... :-(
Moje wielkie nadzieje to:
Nie zrobiłem poprawnie ustawień pamięci dla neo4jZapytanie, którego używam dla neo4j jest całkowicie błędneWszelkie sugestie dotyczące szybkości działania neo4j są mile widziane.
Wielkie dzięki,
Joerg