giovedì 29 settembre 2011

FreeDB to MongoDB


Ultimamente mi trovo a lavorare con MongoDB, ed ecco subito un test di import di massa scritto in java per testare le tempistiche di import e Query del db.

Come al solito utilizzo il freedb, trasformo tutti il db in un succoso file json da 800MB con la classe FreeDbToJson (progetto completo linkato al fondo del post).

questa è una riga del json:

{
   "id":"soundtrack_fe13d011",
   "filename":"soundtrack/fe13d011",
   "revision":"0",
   "title":"100 Love Songs Stage 4 Cd4",
   "genre":"Soundtrack",
   "artist":"IndianDigitalAudio.com",
   "length":"5074",
   "year":"2011",
   "extd":"",
    "tracks":{
              "15":{"title":"Mausam Achanak"},
              "16":{"title":"I Dont Know What To Do"},
              "13":{"title":"Aaja Maahi"},
              "14":{"title":"Janeman"},
              "11":{"title":"Roshan Dil Ka Jahan"},
              "12":{"title":"Yaad Teri Aaye"},
             "3":{"title":"Jo Ghumshuda"},
              "2":{"title":"Dhadke Jiya"},
              "1":{"title":"Nazrein Karam"},
              "10":{"title":"Tum Bhi Ho Wahi"},
             "0":{"title":"Aao Milo Chalo"},
              "7":{"title":"Mausam"},
              "6":{"title":"Mera Pehla Pehla Pyaar"},
              "5":{"title":"Raat Ke Dhai Baje"},
              "4":{"title":"Jaane Tu Meri Kya Hai"},
              "9":{"title":"Pyaar Ki Yeh Kahani"},
              "8":{"title":"Miss You Everyday"}
  }

}
Dopo aver ottenuto questo file eseguo un'altro piccolo programmino in java per importare di massa tutti i record utilizzando la funzionalità requestStart().


package freedbtoMongoDb;

import com.mongodb.DB;
import com.mongodb.DBObject;
import com.mongodb.Mongo;
import com.mongodb.util.JSON;
import java.io.IOException;

public class JsonToMongoDB {

    static String host = "hostname";
    static int port = 27017;
    static String db_name = "freedb";
    static String target_folder = "/marco/mongodb/file/";

    public static void main(String[] args) throws IOException {

        Mongo m = new Mongo(host, port);
        DB db = m.getDB(db_name);
        db.requestStart();

        System.out.println("File: " + target_folder + "disk.json");
       BigFile file = null;
        try {
            file = new BigFile(target_folder + "disk.json");
        } catch (Exception ex) {
            System.out.println("exception: " + ex.getMessage());
        }

        long ts = System.currentTimeMillis();
        int i = 0;
        for (String line : file) {
            db.getCollection("disk").insert((DBObject) JSON.parse(line));
            System.out.println("line: " + i);
            i++;
        }

        System.out.println("tot time: " + (System.currentTimeMillis() - ts));
        db.requestDone();

    }
}

il db mongo server è installato su una vm dedicata invece il programma sopra gira in locale in netbeans, le tempistiche sono state:  - tot time: 959532 ( circa 16 minuti) per 3057298 righe inserite.

[sorgenti]

giovedì 22 settembre 2011

Doctrine MongoDB - @ReferenceOne to different target class






<?

/**
 * @Document
 * @InheritanceType("SINGLE_COLLECTION")
 * @DiscriminatorField(fieldName="type")
 * @DiscriminatorMap({"student"="Student","customer"="Customer"})
 */

class People {


/** @Id */
protected $id;



/** @String */
protected $name;


/** @String */
protected $surname;


        ..etc.. etc...



}





/**
 * @Document
 */
class Student extend People {


/** @String */
protected $course;

/** @String */
protected $year;


        ..etc.. etc...



}




/**

 * @Document

 */

class Customer extend People {


/** @String */
protected $code;

/** @String */
protected $name;


        ..etc.. etc...


}


/**

 * @Document

 */

class MixedPeople {


/** @Id */
protected $id;

        /** @ReferenceOne(targetDocument="People") */
protected $mixedpeople;

        ..etc.. etc...


}

mercoledì 14 settembre 2011

Strumenti per progettare i DB?

Un tempo usavo carta e matita per disegnare i db...
.. fino a che non sono diventati dei mostri di tabelle... (questa volta con MongoDB)


..adesso sotto consiglio di fede sono passato a OmniGraffle, i risultati non sono sempre buoni...

qualcuno mi consiglia un software più definito per lo scopo? (sotto Mac magari anche free... :) )

lunedì 5 settembre 2011

Jetty - Hot Deploy e Reload

per eseguire un reload della singola app è necessario eseguire un

touch /etc/jetty/context/configurazione-webapp.xml


oppure inserire al volo una nuova conf.xml e jetty esegue l'Hot deploy senza bisogno del restart del service.




[grazie a Fabrizio]