powrót

Zadanie 2 (Aggregation Pipeline)



To zadanie zostało wykonane w dwuosobowym zespole o składzie Łukasz Mielewczyk oraz Marek Białousz.
Do rozwiązania zadania została wykorzystana baza danych mongoDB.
Każdy z nas pracował na swoich komputerach, a na końcu porównywaliśmy wyniki.

Informacje o danych

Dane zawierają informacje o transakcjach. Pobierz.
Kolumny:


Rozmiar: 230 MB
Ilość: 1000001


Instalacja i konfiguracja oprogramowania

mongoDB

Do rozwiązania zadania użyto bazy mongoDB. Należy ją pobrać ze strony i zainstalować. Następnie aby uruchomić bazę danych, należy w konsoli cmd i wydać polecenie:

mongod


mongoDB

import danych

Przed wykonaniem czynności upewnij się czy serwer jest uruchiomony. Jeśli nie: przeczytaj jak to zrobić.

Następnie aby zaimportować z pliku do bazy danych (oczywiście baza danych musi być uruchomiona) należy wydać w cmd polecenie:

mongoimport --db test --collection test --file trades.json
Import powinien powodować duże zużycie zasobów (ilustracja niżej):

Procesor podczas importu danych do mongoDB


Pamięć podczas importu danych do mongoDB


Dysk podczas importu danych do mongoDB


Wykonanie trwało ok. 2 minut.
Wyniki były podobne na komputerach Łukasza i Marka.
Ostatecznie powinien pojawić się komunikat: "imported 1000001 documents"


przykładowy rekord

Przed wykonaniem czynności upewnij się czy dane zostały zaimportowane. Jeśli nie: przeczytaj jak to zrobić.

Aby wyświetlić przykładową daną, początkowo trzeba włączyć mongo shell. Polecenie:

mongo
Następnie należy wykonać polecenie:
db.test.aggregate(
  { $limit: 1 }
)


Wówczas powinnino zostać wyświetlone:
Agregacja - przykładowy rekord


ilość danych

Przed wykonaniem czynności upewnij się czy dane zostały zaimportowane. Jeśli nie: przeczytaj jak to zrobić.

Aby zobaczyć ilość danych należy wykorzystać polecenie:

db.test.aggregate( [
  { $group: {
    _id: null,
    count: { $sum: 1 }
  } }
] )
Powinno zostać wyświetlone:
					
{ "_id" : null, "count" : 1000001 }
					
				


sortowanie

Przed wykonaniem czynności upewnij się czy dane zostały zaimportowane. Jeśli nie: przeczytaj jak to zrobić.

Następnie można wyświetlić pierwszych 10 najdroższych transakcji, polecenie:

db.test.aggregate(
  { $sort: { price: -1 } },
  { $limit: 10 }
)
Wówczas powinnino zostać wyświetlone:

Agregacja - sortowanie


szukanie danych

Przed wykonaniem czynności upewnij się czy dane zostały zaimportowane. Jeśli nie: przeczytaj jak to zrobić.

Następnie można wyświetlić dane gdzie ticket jest równe z109 lub z433:

db.test.aggregate(
  { $match: {
    $or: [
      { ticket: "z109" },
      { ticket: "z433" }
    ]
  } },
  { $limit: 10 }
)
Wówczas powinnino zostać wyświetlone:

Agregacja - szukanie danych

sortowanie konretnych danych

Przed wykonaniem czynności upewnij się czy dane zostały zaimportowane. Jeśli nie: przeczytaj jak to zrobić.

Następnie można wyświetlić dane gdzie ticket jest równe z109 oraz posortowano je wg ceny:

db.test.aggregate(
  { $match: { ticket: "z109" } },
  { $sort: { price: -1 } },
  { $limit: 10 }
)
Wówczas powinnino zostać wyświetlone:

Agregacja - sortowanie konretnych danych

sumowanie

Przed wykonaniem czynności upewnij się czy dane zostały zaimportowane. Jeśli nie: przeczytaj jak to zrobić.

Następnie można sumować ceny dla biletów, w tym celu musimy pogrupować dane wg biletów, polecenie:

db.test.aggregate(
  { $group: {
    _id: "$ticket",
    total: { $sum: "$price" } }
  }
)
Wówczas powinnino zostać wyświetlone:

Agregacja - sumowanie

sumowanie i sortowanie

Przed wykonaniem czynności upewnij się czy dane zostały zaimportowane. Jeśli nie: przeczytaj jak to zrobić.

Następnie można sprawdzić jakie 10 pierwszych biletów zostało wysprzedanych za największą cenę, w tym cale należy uzyć polecenia:

db.test.aggregate(
  { $group: {
    _id: "$ticket",
    total: { $sum: "$price" }
  } },
  { $sort: { total: -1 } }
)
Wówczas powinnino zostać wyświetlone:

Agregacja - sumowanie i sortowanie

tablica, średnia i sortowanie

Przed wykonaniem czynności upewnij się czy dane zostały zaimportowane. Jeśli nie: przeczytaj jak to zrobić.

Tym razem można posortować BID'y wg średniej, ponieważ występują w tablicy trzeba je odzielić (polecenie $unwind) - wtedy jedna dana została tak jakby skopiowana tyle ile jest elementów tablicy oraz zostanie do nich przypisany pojedyńczy element tablicy o nazwie kolumny jaka była wcześniej. Następnie pogrupować oddzielone bilety posortować, polecenie:

db.test.aggregate(
  { $unwind: "$details.bids" },
  { $group: {
    _id: "$ticket",
    bids: { $avg: "$bids" }
  } },
  { $sort: { bids: -1 } }
)
Wówczas powinnino zostać wyświetlone:

Agregacja - tablica, średnia i sortowanie

pomijanie pierwszych danych

Przed wykonaniem czynności upewnij się czy dane zostały zaimportowane. Jeśli nie: przeczytaj jak to zrobić.

Tym razem można posortować bilety wg średniej ceny, która jest większa niż 110, bez wyświetlania pierwszych 5. Polecenie:

db.test.aggregate(
  { $group: {
    _id: "$ticket",
    price: { $avg: "$price" }
  } },
  { $sort: { price: 1 } },
  { $match: { price: { $gt : 110 } } },
  { $skip: 5 }
  )
Wówczas powinnino zostać wyświetlone:

Agregacja - pomijanie pierwszych danych

Wnioski

pomiar

Pomiar został wykonany przy użyciu polecenia:
var before = new Date()
#komenda wykonująca agregację
var after = new Date()
execution_mills = after - before
Tabela przedstawia podsumowanie.

Agregacja Ł. Mielewczyk M. Białousz
Przykładowy rekord 79 ms 85 ms
Ilość danych 2327 ms 2383 ms
Sortowanie 5651 ms 6058 ms
Szukanie danych 166 ms 175 ms
Sortowanie konkretnych danych 1049 ms 1320 ms
Sumowanie 1898 ms 2051 ms
Sumowanie i sortowanie 1943 ms 1988 ms
Tablica, średnia i sortowanie 6241 ms 6275 ms
Pomijanie pierwszych danych 1889 ms 2013 ms

Zobrazowanie różnicy czasu wykonania zapytania:

Porównanie czasu wykonania zapytania (w ms).

Spostrzeżenie:
Największe różnice między komputerami są w momencie kiedy przychodzi działanie sortowania całego zbioru danych.

informacje o komputerach

Każdy z nas pracował na komputerze o parametrach przedstawionych w poniżeszej tabeli.

Nazwa Wartosć
Ł. Mielewczyk M. Białousz
Procesor Core(TM) i3-4005U CPU 1,7 GHz 1,7 GHz Intel Core i7-4510U 2.0 GHz
RAM 12 GB 8,0 GB
Dysk HDD Toshiba MQ01ABD025 1TB
System operacyjny Windows 10 64-bit Windows 8.1 x64
Wersje mongoDB mongoDB 3.2.6 mongoDB 3.2.6

podsumowanie

Każdy z pomiarów na komputerze Łukasza są minimalnie lepsze niż u Marka. Prawdopodobne przyczyny takie zachowania: Mimo różnicy w posiadanej pamięci RAM oba komputery zużywały maksimum dostępnej pamięci podczas importu, agregacji i pozostałych badań.
Zasoby żużycia - Ł. Mielewczyk
Zasoby żużycia - M. Białousz

Okazuje się, że pojemność pamięci RAM ma kluczowy wpływ na oceny uzystkiwane w teście RAM i bez względu na szybkość transmisji determinuje maksymalny możliwy rezultat.
Komputer oferujący wyższą wydajność oraz większy komfort pracy z otwartymi kilkoma aplikacjami równocześnie, oraz komputer dla gracza, powinien dysponować minimum 8 GB RAM.
Pamięć RAM jaką posiada komputer Marka jest zatem wymaganym minimum potrzebnym do tych badań, jednak przy pamięci Łukasza, różnica jest zauważalna (tylko przy sprawdzeniu czasu zapytania, gdyż czynności niekiedy trwają kilka sekund).

powrót