CouchDB 8M di documenti
Beh quando sbaglio qualcosa si vede proprio. Parlo del post precedente dove ho provato un inserimento massivo su CouchDB e a 2.5 milioni di contenuti e il document store ha gestito lo spazio disco arrivando a quasi 17G di spazio occupato.
Devo ancora approfondire come mai i metadati gestiti da CouchDB hanno occupato così tanto spazio. Sto seguendo diverse discussioni in proposito e ancora devo provare la compressione e l’ottimizzatore di CouchDB per ridurre ed ottimizzare lo store dei dati.
Tramite il sistema di BULK offerto da CouchDB è possibile gestire un inserimento/aggiornamento massivo ed andare ad ottimizzare il carico verso il server. I risultati di questo test sono quello che realmente mi aspetto da un sistema come CouchDB: 8 Milioni di contenuti in 1 ora e 10 minuti su una macchina virtuale con solo 1G di ram ed 1 CPU virtualizzata tramite VirtualBox da un Mac Book DualCore con 2 G di RAM totali, ovvero una macchina molto molto scarsa in termini di prestazioni.
Come si può vedere il database “geonames_bulk” occupa solo 6GB (MySQL ne occupa meno di 2GB per la stessa quantità di dati) per quasi 8 milioni di documenti mentre “geonames” è arrivato 16.7 GB per soli 2.3 milioni di documenti.
Prossimamente porterò avanti questi test operativi per riuscire ad analizzare il quantitativo di metadati e vedere l’ottimizzatore come va ad agire sulla CPU e sulla quantità dei dati.
Lo script utilizzato (dove si vede la semplicità di CouchDB che lo rende unico):
<?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'
);
$timeStart = microtime(true);
$ch = curl_init('http://couchdb.local:5984/geonames_bulk/_bulk_docs');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
$index = 0;
$data = array();
while (!$file->eof()) {
$document = array_combine($map, $file->fgetcsv("\t"));
$data["docs"][] = $document;
if ($index % 100 == 0) {
$data = json_encode($data);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$returned = curl_exec($ch);
if (!$returned) {
exit("NOT RUN");
} else {
echo ".";
}
$data = array();
}
++$index;
}
$timeEnd = microtime(true);
$timeDiff = $timeEnd - $timeStart;
echo "time taken : {$timeDiff} s";
