CouchDB 2.5 milioni di documenti
Da diverso tempo sto analizzando e provando diversi prodotti della famiglia NOSQL, in particolare MongoDB, Redis e CouchDB. Ieri ho portato a termine un primo inserimento massivo di 2.5 milioni di documenti.
CouchDB è e dopo ieri rimane il Document Store che preferisco (rispetto a MongoDB in quanto Redis è un Key Value in senso stretto più che un Document Store).
I dati di caricamento sono stati presi da punti geolocalizzati nel mondo, ovvero città e destinazioni per un totale di più di 2.5 milioni di documenti.
Devo ammettere che per quanto sia stupendo il sistema CouchDB i dati su disco occupano veramente tanto spazio. Stiamo parlando di 17GB di spazio contro i circa 2GB di uno stesso test eseguito con MySQL su engine MyISAM e due soli indici (primario e fulltext su tre colonne) e tre volte i dati immagazinati (6M+).
Le generazione delle viste per una navigazione basata su schemi di Map/Reduce invece non è invasiva sullo spazio disco e la generazione è abbastanza veloce anche su una base così estesa.
La cosa più incredibile di CouchDB è la semplicità di utilizzo, se vogliamo “spingere” i contenuti singolarmente presi da CSV basta realizzare uno script banalissimo in PHP
<?php
$filename = dirname(__FILE__) . '/allCountries.txt';
$file = new SplFileObject($filename ,'r');
$map = array(
0 => 'id',
1 => 'name',
2 => 'asciiName',
3 => 'alternateNames',
4 => 'latitude',
5 => 'longitude',
6 => 'featureClass',
7 => 'featureCode',
8 => 'countryCode',
9 => 'cc2',
10 => 'admin1Code',
11 => 'admin2Code',
12 => 'admin3Code',
13 => 'admin4Code',
14 => 'population',
15 => 'elevation',
16 => 'gTopO30',
17 => 'timezone',
18 => 'modificationDate'
);
$id = 1;
while (!$file->eof()) {
$data = json_encode(array_combine($map, $file->fgetcsv("\t")));
$headers = array(
'Content-Type: application/json',
'Content-Length: ' . strlen($data)
);
$ch = curl_init('http://couchdb.local:5984/geonames/' . $id);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$returned = curl_exec($ch);
++$id;
// echo ($id % 80 == 0) ? "." . PHP_EOL : '.';
}

Trackbacks for this post