Skip to content

jcimoch/noSQL-Egzamin

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

17 Commits
 
 
 
 
 
 
 
 

Repository files navigation

**Hardware:**
Desktop:
CPU Core i7 4770K @ 4.5Ghz
RAM 16 GB DDR3 1600Mhz CL10
SSD Plextor M5S 250mb/s SATA 3
HDD 1TB Seagate 64mb cache 7200rpm

Rozwiązania zadań na egzamin:

Zadanie 3a:

  • Przygotować funkcje map i reduce, które: -wyszukają wszystkie anagramy w pliku word_list.txt

Po zaimportowaniu pliku txt ( jako csv z nagłówkiem id i word ) , wystarczy uruchomić spreparowane funkcję map-reduce.

mongoimport -c words -d nosql--file K:\mongoBaza\words.csv --type csv --headerline

Czas: Pomijalnie mały.

Uruchamiamy mapreduce: LINK

{
    "result" : "letters.out",
    "timeMillis" : 384,
    "counts" : {
        "input" : 8199,
        "emit" : 8199,
        "reduce" : 914,
        "output" : 7011
    },
...

Anagramów jest: 914

Przykładowe 10:

db['letters.out'].find({value:{$type:2}}).sort({id:-1})
/* 0 */
{
    "_id" : "a,a,b,d,o,r",
    "value" : "abroad,aboard"
}

/* 1 */
{
    "_id" : "a,a,b,l,s,t",
    "value" : "basalt,tablas"
}

/* 2 */
{
    "_id" : "a,a,b,m,n,t",
    "value" : "bantam,batman"
}

/* 3 */
{
    "_id" : "a,a,c,e,t,v",
    "value" : "caveat,vacate"
}

/* 4 */
{
    "_id" : "a,a,c,i,m,n",
    "value" : "caiman,maniac"
}

/* 5 */
{
    "_id" : "a,a,c,l,r,s",
    "value" : "rascal,scalar"
}

/* 6 */
{
    "_id" : "a,a,c,l,s,u",
    "value" : "casual,causal"
}

/* 7 */
{
    "_id" : "a,b,i,n,r,s",
    "value" : "bairns,brains"
}

/* 8 */
{
    "_id" : "a,b,i,n,r,y",
    "value" : "binary,brainy"
}

/* 9 */
{
    "_id" : "a,b,m,r,s,u",
    "value" : "umbras,rumbas"
}

/* 10 */
{
    "_id" : "a,b,n,o,r,y",
    "value" : "barony,baryon"
}

Zadanie 3b:

  • Wyszukają najczęściej występujące słowa z Wikipedia data PL aktualny plik z artykułami, ok. 1.3 GB

W tym zadaniu okazało się, że zaimportowanie pliku xml do mongo nie będzie zadaniem trywialnym. Postanowiłem sparsować plik i przerobić na interesujący mnie .json. Do tego celu użyłem node.js oraz modułu SAX ( moduły takie jak xml2js nie nadawały się do tego zadania ze względu na rozmiar pliku ).

Uruchamiamy skrypt LINK W którym wyłuskujemy tylko id artykułu oraz tekst. Oczysczamy dane ze znaków specjalnych i innych śmieci. Reszta danych jest zbędna do zadania.

lang time
node.js ~32min
java ~8min

Wykonujemy import nowego pliku json. Warto tutaj wspomnieć, że ten sam program napisany w JAVIE przez kolege z wykorzystaniem SAX wykonał się 4x szybciej. Łatwo wywnioskować, że node.js do zadań wymagających dużo od procesora nie jest najlepszym wyborem.

   mongoimport -c wiki -d nosql --file K:\mongobaza\output.json --type json --jsonArray 

Czas: ~10min

Uruchamiamy skrypt mapreduce LINK

drive type time
hdd ~5h
ssd ~1h 20min

alt text

{
    "result" : "wiki.out",
    "timeMillis" : 26472252,
    "counts" : {
        "input" : 1671883,
        "emit" : 520337162,
        "reduce" : 63187424,
        "output" : 5429884
    },
db['wiki.out'].find().sort({value:-1}).limit(10);

10 najczęstszych słów z artykułów:

/* 0 */
{
    "_id" : "urodził",
    "value" : 5382
}

/* 1 */
{
    "_id" : "sześć",
    "value" : 5352
}

/* 2 */
{
    "_id" : "Urodził",
    "value" : 5342
}

/* 3 */
{
    "_id" : "ukończeniu",
    "value" : 5307
}

/* 4 */
{
    "_id" : "Dwa",
    "value" : 5261
}

/* 5 */
{
    "_id" : "rodzinie",
    "value" : 5261
}

/* 6 */
{
    "_id" : "przebywał",
    "value" : 5254
}

/* 7 */
{
    "_id" : "założył",
    "value" : 5246
}

/* 8 */
{
    "_id" : "pozostał",
    "value" : 5234
}

/* 9 */
{
    "_id" : "powrocie",
    "value" : 5229
}

Jak łatwo zauważyć wyniki są podejrzanie małe, co ciekawe pokrywają się z wynikami w parserze SAX w implementacji javowej. Aby je zweryfikować postanowiłem użyć jeszcze pasera napisanego w php. Wyniki z tego parsera są kompletnie odmienne ale jednocześnie nie do końca poprawne, ponieważ parser ten uwzględnia cały tekst, łącznie z tagami np. "span", "bgcolor" , "www" . Przez co wyniki są zakłamane w drugą stronę.

skrypt wykonywał się znacznie dłużej niż implementacja w js czy javie

lang time
php ~58min
db['wiki.out'].count()
5441098
db['wiki.out'].find({value: {$gt: 100}}).sort({value: -1})
{ "_id" : "w", "value" : 13318251 }
{ "_id" : "i", "value" : 5673827 }
{ "_id" : "align", "value" : 4910631 }
{ "_id" : "–", "value" : 4812528 }
{ "_id" : "na", "value" : 4483914 }
{ "_id" : "z", "value" : 4411273 }
{ "_id" : "ref", "value" : 4264212 }
{ "_id" : "data", "value" : 3495151 }
{ "_id" : "Kategoria", "value" : 3169246 }
{ "_id" : "do", "value" : 2823615 }
{ "_id" : "center", "value" : 2719307 }
{ "_id" : "się", "value" : 2571716 }
{ "_id" : "http", "value" : 2324475 }
{ "_id" : "br", "value" : 2221204 }
{ "_id" : "W", "value" : 2072932 }
{ "_id" : "www", "value" : 2053453 }
{ "_id" : "left", "value" : 2037762 }
{ "_id" : "tytuł", "value" : 1668387 }
{ "_id" : "roku", "value" : 1511654 }
{ "_id" : "small", "value" : 1466680 }
{ "_id" : "a", "value" : 1449271 }
{ "_id" : "style", "value" : 1432662 }
{ "_id" : "bgcolor", "value" : 1400557 }
{ "_id" : "flaga", "value" : 1370419 }
{ "_id" : "px", "value" : 1339655 }
{ "_id" : "nie", "value" : 1290672 }
{ "_id" : "r", "value" : 1286691 }
{ "_id" : "RD", "value" : 1275575 }
{ "_id" : "jest", "value" : 1260071 }
{ "_id" : "pl", "value" : 1235733 }
{ "_id" : "name", "value" : 1098228 }
{ "_id" : "o", "value" : 1077834 }
{ "_id" : "język", "value" : 1059868 }
{ "_id" : "nazwa", "value" : 1056992 }
{ "_id" : "Plik", "value" : 1023572 }
{ "_id" : "to", "value" : 1021988 }
{ "_id" : "przez", "value" : 1010958 }
{ "_id" : "url", "value" : 1005558 }
{ "_id" : "infobox", "value" : 995637 }
{ "_id" : "span", "value" : 991489 }

alt text

About

UG noSQL egzamin map reduce

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published