Martyna Krajnik, [email protected]
Rozwiązania zadań z przedmiotu Bazy NoSQL:
- Zaliczenie:
- Neo4j
- EDA
- Egzamin:
- Aggregation Pipeline
- MapReduce
Producent | Dell |
---|---|
Model | Optiplex 9030 |
Procesor | Intel Core i5-4590S @ 3.00 GHz |
Dysk | 512 GB |
Pamiec RAM | 8 GB |
System | Windows 10 |
Typ systemu | 64-bit |
Mongo | 3.0.7 |
Postgres | 9.4.5 |
Python | 3.5.0 |
Plik RC_2015-01.bz2 zajmuje 5,07 GB (bajtów: 5 452 413 560). Wszystkich komentarzy/JSON-ów jest 53 851 542.
Użyty program 7zip
Czas: 13 minut
Miejsce zajete po rozpakowaniu: 29,4 GB (bajtów: 31 648 374 104)
-- | Mongodb | Postgresql |
---|---|---|
Czas | 33 minuty | 45 minut |
Zużycie zasobów | Mongodb korzystalo z wszystkich procesorow jednoczesnie, dodatkowo nie zuzywalo przez caly czas trwania importu caly czas procesora i dysku na 100%. Korzystalo naprzemiennie z dysku / procesora. Pamiec poczatkowo rosla, az w koncu stanela na granicy 95-97 %. | -- |
Łatwosc importu | Używamy jednego polecenia | Trzeba plik przeparsować, a potem za pomoca skryptu wrzucic do bazy. |
Korzystanie z danych | Kazdy komentarz ma swoje "atrybuty" z ktorych mozemy korzystać | Wszystkie dane sa wrzucone do jednej kolumny typu data json |
Używamy komendy mongoimport do importu
Jak widać, Mongo naprzemiennie korzysta z dysku/procesora. Nie wykorzystuje caly czas w 100% wszystkich zasobów.
Podczas trawnia importu - Mongo wykorzystuje cala pamiec dostepna na komputerze, co oznacza, ze podczas trwania importu najlepiej odejsc od komputera i zrobic sobie kawe... Bo korzystanie z niego podczas importu jest strasznie uciazliwe. Tak jak wczesniej bylo widac, dysk/procesor dziala naprzemiennie - przez caly import.
Jeszcze spojrzmy jak Mongo wykorzystuje procesory... Wielki + dla Mongo - wykorzystuje równomiernie procesory dostepne w komputzerze, nie obciaza tylko jednego.
Import zakonczony powodzeniem, zaimportowano wszystkie rekordy
Do importu Postgres musimy przygotować plik, trzeba zamienić apostrofy na inny znak np. spacje. Wtedy dopiero poprawnie zaimportuje sie do bazy. W PowerShellu używam polecenia:
get-content .\RC_2015-01 | %{$_ -replace "'"," "} > RC_2015-011
Teraz w Postgresie tworzymy tabele:
CREATE TABLE subreddits(
id serial primary key,
data json
);
Za pomoca skryptu w pythonie importujemy baze:
import psycopg2
def insert():
plik = "/mnt/vb/RC_2015-01.json"
conn = psycopg2.connect(
database="moja",
user="postgres",
host="/tmp/",
password="123456"
)
cursor = conn.cursor()
i = 1
with open(plik, "rb") as file:
for a in file:
cursor.execute("INSERT INTO subreddits (data) VALUES ('%s')" % (a))
i=i+1
if i % 10000 == 0:
conn.commit()
conn.commit()
cursor.close()
conn.close()
insert()
Zużycie zasobów:
Postgres dziala podobnie jak Mongo - korzysta naprzemiennie z dysku/procesora, ale pamiec nie jest wykorzystywana w dokladnie 100%.
Postgres równomiernie rozklada prace na kazdy z procesorow
Przykladowy rekord:
mydb.myColl.count();
select count(*) from subreddits ;
-> Ile jest zarchiwizowanych plików
db.myColl.find({ "archived":"true" }).count();
Jak widać... nie archiwizuja ;)
-> Przykladowy rekord
db.myColl.findOne();
-> Suma punktów autora YoungModern
db.myColl.aggregate ([
{ $match: { "author": "YoungModern" } },
{ $group: { _id: "$author", total: { $sum: "$score" } } }
])
Przed pisaniem zapytań do bazy dopisany zostal indeks:
Miejscowosci oddalone o 10 km od Bolszewa:
> db.miasta.find({loc: {$near: {$geometry: {type: "Point", coordinates: [18.17585,54.618011]}, $maxDistance: 10000}}}).skip(1)
Miejscowosci ktore maja w nazwie "Nowa"
Dodajemy indeks na pole "name" zeby w nim przeszukiwac:
db.miasta.createIndex( { name: "text" } )
Zapytanie:
db.miasta.find( { $text: { $search: "Nowa" } } )
LineString z Wejherowa do Gdańska
db.miasta.find({"name":"Gdańsk"})
db.miasta.find({"name":"Reda"})
db.miasta.find({"name":"Rumia"})
db.miasta.find({"name":"Gdynia"})
db.miasta.find({"name":"Sopot"})
Miejscowosci zawierajace slowo "Biała" majace id wieksze niz 1000000
db.miasta.find({ $and : [ {"_id": { $gt: 1000000} } , { $text: { $search: "Biała" } }]})