zpi2011asvis / asvis

Wizualizacja sieci AS (Autonomous System - System Autonomiczny). Projekt na Zespołowe Przedsięwzięcie Informatyczne aka. praca inż. @ PWR
5 stars 1 forks source link

Import z mysql-a #7

Closed Reinmar closed 12 years ago

Reinmar commented 13 years ago

Import z mysql-a przy pomocy odpalanego z konsoli skryptu, biorącego swoje dane z config.php

Ta wersja obejmuje jedynie import (bez update'ów). Import powinien oczywiście rozpocząć się czyszczeniem bazy. Powinna być opcja (podawana do skryptu - już nie z config.php) ograniczania ilości importowanych wierzchołków. Pomiń ASPoole

gloowa commented 12 years ago

pierwsza wersja jest ale jeszcze nie działa do końca poprawnie, nody dodaje ok ale cos zamieszałem przy krawędziach. poprawki WIP

Reinmar commented 12 years ago

Fajno.

Ale od razu przypominam jak zmienne mają być nazywane. Na pewno nie tak:

$mysqlConnection

Jeśli tak będziecie chcieli (wszyscy, którzy piszecie w PHP), to przeedytuj styleguide'a. Tylko pamiętaj, że w JS na pewno nie będę tak pisał, więc nie zmień też opcji dla tego języka.

gloowa commented 12 years ago

zmieńmy standard nazewnictwa zmiennych w php na javowy: nazwaZmiennejWielowyrazowej = 23;

na razie ten kod co wrzuciłem jest do chrzanu, testuje teraz wersję juz odpalaną spod konsoli ale to wszystko trwa wieki całe... samo wrzucenie nodów to jakieś 10minut około...

Reinmar commented 12 years ago

To se zmień - ale wtedy wszyscy musicie tak pisać. Tylko tak jak pisałem - tylko PHP. JS nie ruszaj, bo to ja narzucam.

Co do długiego importu - też Ci pisałem - zrób ogranicznik ilości ładowanych node'ów. Inaczej Cię szlag trafi podczas testowania.

Reinmar commented 12 years ago

Swoją drogą - ciekawe o ile szybszy jest ten driver binarny (ten drugi). Możliwe, że łatwo dałoby się go podpiąć (do importu, a może i w ogóle) zamiast tego, który używamy. Możesz się próbować zorientować jak skończysz import.

Aczkolwiek... podczas działania importu mi napierdziela Java po procku. Co jest bardzo dziwne. Ale może też import do tego typu bazy jest tak koszmarnie wolny żeby odczyt był szybki - może tutaj driver nie będzie miał nic do znaczenia. Tylko np. baza spędza tyle czasu robiąc indeksy dla pól. To na pewno jest ciekawostka.

gloowa commented 12 years ago

tak, tylko że jak zaimportuje 100 nodów to potem jak zaimportuje połączenia to sie okazuje ze jest ich 30-pare i te 100 nodów sie nie łączy wogóle nie moge zobaczyć czy struktura jest zachowywana. same funkcje insertowania działają.

Reinmar commented 12 years ago

Na tę chwilę wystarczy Ci to do testowania. Weźmiesz 200 node'ów i popatrz do mysqla:

mysql> select * from asdown where asnum < 200 and asnumdown < 200 and asnum > 0 and asnumdown > 0;
+-------+-----------+
| ASNum | ASNumDown |
+-------+-----------+
|    32 |        71 |
|    34 |         2 |
|   101 |        73 |
|   174 |         3 |
|   174 |        14 |
|   174 |        26 |
|   174 |        34 |
|   174 |        55 |
|   174 |        72 |
|   174 |        91 |
|   174 |        98 |
|   174 |       103 |
|   174 |       160 |
|   174 |       166 |
+-------+-----------+
14 rows in set (0.00 sec)

mysql> select * from asup where asnum < 200 and asnumup < 200 and asnum > 0 and asnumup > 0;
+-------+---------+
| ASNum | ASNumUp |
+-------+---------+
|     2 |      34 |
|     3 |     174 |
|    14 |     174 |
|    26 |     174 |
|    34 |     174 |
|    55 |     174 |
|    71 |      32 |
|    72 |     174 |
|    73 |     101 |
|    91 |     174 |
|    98 |     174 |
|   103 |     174 |
|   160 |     174 |
|   166 |     174 |
+-------+---------+
14 rows in set (0.01 sec)
Reinmar commented 12 years ago

A no i będziesz miał terminatory oczywiście - których jest dużo.

BTW. terminatory bym robił za pomocą ASConn który nie ma ustawionego out. Myślisz że to ma sens? Albo wprowadzić flagę "end", czy inną w ASConn.

gloowa commented 12 years ago

a ja mysle ze wiekszy ma u nas sens nie dodawac rekordu i zadawac zapytanie w stylu: select from ASNode where out = null

Reinmar commented 12 years ago

Już o tym rozmawialiśmy, że tak być nie może, bo wtedy nie wiadomo czy to koniec sieci, czy sieć nie została przeskanowana do końca. Aczkolwiek to na pewno by było dużo szybsze... Ok. Zostawmy tak jak mówisz. Co najwyżej to zmienimy.

gloowa commented 12 years ago

AHA! odkryłem dosyć poważny defket danych w mysql-u:

SELECT count(asnum) FROM asup
WHERE asnumup <> -1
AND asnum NOT IN (SELECT asnum FROM aspool);

count(asnum)
255

czyli jest 255 krawędzi które prowadzą do nieistniejących nodów, to samo jest z asdown (tyle ze inna liczba)

Reinmar commented 12 years ago

Powyższy komentarz był do Twojego komcia o terminatorach.

A propos dziurawej bazy - to dlatego, że nie dostaliśmy całej bazy ases. Po prostu automatyczne uzupełnienie z aspool nie dało rady, bo nie wszystkie asy mają aspoole. Dlatego można do tego mojego mini zapytania uzupełniającego asy dodać też część wybierającą numy z asup i asdown. Mogę to napisać jeśli nie wiesz jak. Słowo klucz union, a później distinct.

BTW. Napiszę do prowadzących w tej sprawie, że ciągle czekamy.

Reinmar commented 12 years ago

Aha - czytałem na temat bazy - mówią że insert też jest bardzo szybki i nie ma opcji żeby to tak powoli działało. Czyli to HTTP tak spowalnia.

Dlatego spróbuj może później podpiąć tego drivera natywnego. Skoro i tak używamy tylko query(sql), to nic więcej nam nie jest potrzebne.

gloowa commented 12 years ago

skomitowałem konsolową wersję importera.

Same nody dodaje teraz błyskawicznie, natomiast dodawanie ASConnów to jest jakieś nieporozumienie, u mnie jeden na sekundę :/

Ponadto wywala się driver przy oczyszczaniu bazy, ALE ją czyści... trzeba go 2-gi raz odpalić żeby zaimportował... Pracuje nad tym ale za chwile bede musiał zrobic przerwe i dopiero wieczorem wrócę do tego.

gloowa commented 12 years ago

OK, wieczorem spróbuje przemigrować importer na ten ster niższego poziomu.

EDIT:

nie no, to jest cos nie tak chyba z moim kodem bo ASNołdy sie dodały w minutę a teraz po 10 dalszych minutach jest dodane tylko 400 ASConnów

Reinmar commented 12 years ago

Ponadto wywala się driver przy oczyszczaniu bazy, ALE ją czyści... trzeba go 2-gi raz odpalić żeby zaimportował...

  • a sprawdziłeś komunikat o błędzie, czy nie? ;>
  • i czy zrobiłeś ten fix w orientdb-php, który mówiłem, że trzeba zrobić?

Same nody dodaje teraz błyskawicznie, natomiast dodawanie ASConnów to jest jakieś nieporozumienie, u mnie jeden na sekundę :/

Ciekawe - popatrzę jak to robisz. Może coś wymyślę. Bo 1/s to wynik niedopuszczalny oczywiście.

Reinmar commented 12 years ago

Masz błąd:

$condns = mysql_query('SELECT asnum, asnumdown FROM asdown WHERE asnumup <> -1 ORDER BY asnum');

To zapytanie oczywiście nie pójdzie.

gloowa commented 12 years ago

a sprawdziłeś komunikat o błędzie, czy nie? ;>

tak ale dopiero teraz skojarzyłem go z:

i czy zrobiłeś ten fix w orientdb-php, który mówiłem, że trzeba zrobić?

nie bo zrozumiałem że ty poprawiłeś i skomitowałeś ale teraz juz wiem że nie :P możesz mi tu wkleić tą linijkę i w którym wierszu się powinna znaleźć?

Reinmar commented 12 years ago

Przejrzałem skrypt. Jedyne co można poprawić (najprawdopodobniej to powinno sporo pomóc), to najpierw wgrać wszystkie krawędzie (tylko ASConn) i dopiero na koniec zrobić update'y do ASNode (.out i .in) - jednorozowo ustawić cały set. Ale to wymagałoby sporo pracy, więc może szybciej będzie przejść na natywny driver.

Reinmar commented 12 years ago

nie bo zrozumiałem że ty poprawiłeś i skomitowałeś ale teraz juz wiem że nie :P możesz mi tu wkleić tą linijkę i w którym wierszu się powinna znaleźć?

Jest w tym repo od orientdb-php w "pull requests". Ja nie mogę tego scommitować bo to zewnętrzne repo. Koleś niestety powoli coś pracuje i nie sprawdził tych zmian.

gloowa commented 12 years ago

Masz błąd: $condns = mysql_query('SELECT asnum, asnumdown FROM asdown WHERE asnumup <> -1 ORDER BY asnum'); To zapytanie oczywiście nie pójdzie.

Heh, nawet nigdy nie wytrwałem do asdownów :( Na raziem asup obczajam.

Porobiłem testy (tym razem poprawnie) i to jednak nie php tak zwalnia całość tylko same inserty ASConów.

Przygotuje na wieczór coś z RAW driverem.

Reinmar commented 12 years ago

Świetnie. Ja sprawdzę też u mnie jak to działa.

gloowa commented 12 years ago

Wrzuciłem RAW-Importer-a (tylko ASNode na razie) i ide lulu. ASNołdy insertuje szybko-zgrabnie. Zobaczymy jak z ASConnami jutro.

Reinmar commented 12 years ago

po deletcie

insert into ases (ASNum, ASName) select distinct(ASNum), concat('AS', ASNum) from (select asnum from aspool union select asnum from asdown union select asnum from asup) asesnames;
Reinmar commented 12 years ago

insert into ases (ASNum, ASName) select distinct(ASNum), concat('AS', ASNum) from (select asnum from aspool union select asnum from asdown union select asnum from asup union select asnumdown as asnum from asdown union select asnumup as asnum from asup) as asnums where asnum > -1;
Reinmar commented 12 years ago

Poprawiłem (tak naprawdę przepisałem, bo piszesz straszny kod ;) Twojego importera. Był mały błąd z tym co próbowałeś do tej tablicy i gdzie wpycha - stąd była pusta.

Pliki masz u mnie w tests/reinmar/

Tak więc import działa. Tylko... działa PRZERAŹLIWIE powoli. Zrobiłem w chuj testów - wywaliłem bazę, zacząłem z nową z czystym schematem (zobacz do tests/reinmar) z bazą w pamięci, z klasami nie bazującymi na OGraphXXXX. NIC do cholery. Jeden update 0.5s. Zmieniłem konfigurację bazy, wyłączyłem logi, zmieniłem inne ustawienia - dupa. To jest przeraźliwie powolne.

Napisałem więc na liście dyskusyjnej OCB. Bo problemem nawet większym niż import jest... wcale nie szybki select. Wręcz koszmarny. Jeśli tak zostanie, to kurwa... będziemy musieli użyć innej bazy ;/

Reinmar commented 12 years ago

HAHAA!! Napisałem na listę i dostałem odpowiedź. Jedna zmiana w zapytaniu update #cluster:id set a = [] i przyspieszenie z 8h->30s na update wszystkich rekordów :D. Mega. Teraz możemy uznać, że to działa szybko.

Reinmar commented 12 years ago

Ok. jak będziesz się z tym bawił to sobie stwórz bazę po prostu z tego mojego skryptu, który utworzyłem w swoim tests/reinmar. Nie trzeba żadnych extendów z OGraph.

Wszystko zajebiście działa, choć zapytania o całe traversy nie są jakieś uber szybkie. Ale może i tak nie ma tragedii. No i na pewno łatwiej można sobie doszukać różnych rzeczy tak niż przez MySQL'a.

Reinmar commented 12 years ago

BTW. zauważyłem, że w tej pieprzonej MySQLowej bazie nawet connectiony pomiędzy node'ami są spierdzielone. Wszystkie są zdublowane. Czyli pomiędzy node'a A i B są connectiony z A do B (up) i z B do A (down), które są tym samym. Popatrz na to:

> SELECT in.in.asString() FROM #7:293                    

---+---------+--------------------
  #| RID     |in                  
---+---------+--------------------
  0|         |[#7:16, #7:43, #7:44, #7:45, #7:50, #7:68, #7:291, #7:292, #7:377, #7:683, #7:2640, #7:3152, #7:3380, #7:3424, #7:3428, #7:3431, #7:3443, #7:3562, #7:3671, #7:3970, #7:6406, #7:10702, #7:11678, #7:3561, #7:22388]
---+---------+--------------------

> SELECT out.out.asString() FROM #7:293

---+---------+--------------------
  #| RID     |out                 
---+---------+--------------------
  0|         |[#7:3561, #7:22388, #7:16, #7:43, #7:44, #7:45, #7:50, #7:68, #7:291, #7:292, #7:377, #7:683, #7:2640, #7:3152, #7:3380, #7:3424, #7:3428, #7:3431, #7:3443, #7:3562, #7:3671, #7:3970, #7:6406, #7:10702, #7:11678]
Reinmar commented 12 years ago

Mega zabawka :). Wiem już np. jak wyciągnąć w ułamek sekundy strukturę drzewa do określonego poziomu wgłąb. Jednym zapytaniem wszystkie dane. Robi wrażenie. Okazuje się, że traverse() nie jest potrzebny - fetch plan wystarczy.

gloowa commented 12 years ago

Wow, nieźle!

A to przyspieszenie updaejtów to dlatego że zapytanie zostało zmienione z UPDATE ASNode SET in = [...] out = [...] WHERE @rid = RID na UPDATE RID SET in = [...] out = [...] ??

Jeśli tak to mogli by troszki popracować nad optymalizacją tych zapytań, bo w obu przypdakach baza dostaje te same dane (rid, in, out). No ale grunt że działa.

Poprawiłem bug w twoim skrypcie create_db.sql, teraz można go odpalić o tak: & /orientdb/bin/> ./console.sh ../../../../tests/reinmar/create_db.sql POD WARUNKIEM że baza asvis nie istnieje.

Reinmar commented 12 years ago

To nei był bug, bo tam były po prostu różne kawałki skryptu, które sobie kopiowałem. Ale ok. W każdym razie teraz trzeba się zastanowić jak pobrać dane z MySQL-a żeby nie mieć dublowania połączeń. Aczkolwiek trzeba sprawdzić, czy to rzeczywiście są duble - czyli porównać to z CIDR-em. Jeśli dwa Node'y są tam połączone na zasadzie - z A do B jest UP, a z B do A DOWN, to powinniśmy mieć to połączenie chyba tylko raz - będzie o wiele mniej danych, a wydaje mi się, że takie jest znaczenie tegoż.

Popatrz np. na:

mysql> select count(*) from asup join asdown where asup.asnum = asdown.asnumdown and asup.asnumup = asdown.asnum;
+----------+
| count(*) |
+----------+
|    55112 |
+----------+
1 row in set (0.16 sec)

Wynika z tego, że jest 50k! połączeń, które są z A do B UP i z B do A DOWN, a to jest to samo połączenie, ale dwukierunkowe. Problem w tym, że tych kombinacji up i down z a do b i b do a jest 2^4-1, czyli sporo - dlatego trzeba przemyśleć jak to zapisać w bazie i później jak wyświetlać ;/

Reinmar commented 12 years ago

W każdym razie - żebyś miał co robić nim się dogadamy jak naprawdę powinna ta struktura wyglądać, to możesz zająć się tym - https://github.com/zpi2011asvis/asvis/issues/6 - czyli podstawowymi narzędziami, które będziemy używać. Czyli postawienie drivera do bazy we frameworku (gdzieś w konstruktorze do resource'a np.), zrobienie struktur pod API, zrobienie klasy Engine'a, ze statycznymi metodami, który to tak naprawdę będziemy odpytywać o dane, a dopiero on będzie gadał z bazą (akcje powinny być minimalnie krótkie, Engine powinien mieć ustawiony connection do bazy jako statyczną zmienną). Itd. itd.

Tego ticketa zamknij jak zrobisz skrypt do importu w scripts/ + skrypt do stawiania bazy (też w scripts/). Skrypt do stawiania bazy powinien usuwać istniejącą i wykonywać ten SQL, który mi poprawiłeś.

Reinmar commented 12 years ago

One more thing - jako że obaj z @mactoob macie to samo zadanie, to Ty sobie zbranchuj kod. W gicie to jest mega zajebiście proste i fajne. Robisz:

git branch moj-branch
checkout moj-branch # teraz jesteś w branchu (to nie svn - tutaj pracujesz na tym samym drzewie plików - nie w żadnym podkatalogu)
touch x # stworzmy testowo jakiś plik
ll # masz ten plik
checkout master
ll # nie ma pliku x!
checkout moj-branch
git commit -a -m "kopytko"
git push origin moj-branch

O tym jak merge'ować to może kiedy indziej. Prawda że branche są fajne? :)

gloowa commented 12 years ago

Problem w tym, że tych kombinacji up i down z a do b i b do a jest 2^4-1, czyli sporo - dlatego trzeba przemyśleć jak to zapisać w bazie i później jak wyświetlać ;/

Może w ASConn zamiast pola boolean:up dać (short?)int:dir, gdzie 1 - up, 2 - down, 3 - bi ?

W każdym razie - żebyś miał co robić nim się dogadamy jak naprawdę powinna ta struktura wyglądać, to możesz zająć się tym - https://github.com/zpi2011asvis/asvis/issues/6

Roger.

Tego ticketa zamknij jak zrobisz skrypt do importu w scripts/ + skrypt do stawiania bazy (też w scripts/). Skrypt do stawiania bazy powinien usuwać istniejącą i wykonywać ten SQL, który mi poprawiłeś.

erm. w sensie chodzi ci żebym zrobił katalog scripts w roocie projektu tak? w sensie asvis/scripts a nie db/scripts czy backend/scripts?

Reinmar commented 12 years ago

Może w ASConn zamiast pola boolean:up dać (short?)int:dir, gdzie 1 - up, 2 - down, 3 - bi ?

Tak - o tym mniej więcej myślałem. Ale muszę to przemyśleć dokładnie, bo można się wkopać w niejednoznaczność.

erm. w sensie chodzi ci żebym zrobił katalog scripts w roocie projektu tak? w sensie asvis/scripts a nie db/scripts czy backend/scripts?

Takowy już istnieje. https://github.com/zpi2011asvis/asvis/tree/master/scripts

gloowa commented 12 years ago

Masz w niedziele czas zeby sie na godzinkę spotkać i obgadać ten cały #$%#@ Team Foundation Server? Byłem na tym szkoleniu i juz mniejwięcej kumam ocb, tylko trzeba zacząć to gówno wypełniać bo to jest ''wymóg formalny''. <ciężkie westchnienie>

Zamykam issue.

Reinmar commented 12 years ago

Spotkamy się na zajęciach. Nie ma co tracić czasu poza studiami. Lepiej kodować wtedy :)

gloowa commented 12 years ago

ok