Dati in memoria di massa

Un processo efficiente di analisi dei dati parte da un utilizzo adeguato della memoria di massa

.

Siulisse Bestpractice Internationalisation tools

Log in to use the pretty print function and embed function.
Aren't you signed up yet? signup!

In un articolo del maggio scorso (Data Mining per l'analisi dei flussi di commercio estero) ho descritto i contenuti del Sistema Informativo Ulisse e gli strumenti informatici utilizzati per il relativo data mining. La grande quantità di dati contenuta in questo sistema ha evidenziato quanto sia importante la loro organizzazione e la loro memorizzazione su supporti che rendevano facile la loro ricerca e lettura. In questo articolo mi soffermerò sulle problematiche che la gestione di grandi quantità di dati solleva in termini di memorizzazione di massa. Questo articolo non ha pretese nè di esaustività né di scientificità. Esso vuole essere solo una narrazione di alcune problematiche, finalizzata a costruire un ponte tra le esigenze operative di conoscenza di un data scientist e le problematiche informatiche complesse che nascono dalla gestione di grandi quantità di dati.


Il grafico che segue riporta la mappa concettuale dei temi tratti nell'articolo.

Mappa contettuale memoria di massa

Iniziamo il nostro percorso, richiamando la distinzione tra memoria centrale e memoria di massa di un computer. La memoria centrale (la RAM, ad esempio) è quella che il computer utilizza per fare i calcoli. La memoria di massa (l'hard disk, ad esempio) è quella finalizzata a preservare i propri dati, in modo stabile e non cancelabili, se non con azioni specifiche. Nei progetti di elaborazione dati è normale memorizzare i propri dati sulla memoria di massa per poi caricarli, all'occorenza, nella memoria centrale. Le modalità di trasferimento dei dati, necessari all'elaborazione, dalla memoria di massa alla memoria centrale è una fase importante per l'efficienza dell'intero processo di analisi.

I file (e i loro limiti)

Se i dati sono relativamente pochi, il modo più facile di procedere è quello di salvarli in un unico file e leggere l'intero contenuto. I file possono essere di due tipi: testuali e binari. I file testuali contengono sequenze di bit che possono essere trasformate in caratteri, rendendo i file utilizzabili da più tipologie di programmi. Un esempio importante di questa tipologia di file sono i file CSV (Comma Separated Values), dove i dati sono memorizzati nelle diverse righe del file, separandoli, come dice il nome, da una virgola (o da altro separatore). I file binari contengono sequenze di bit che possono essere lette e interpretate solo dalla tipologia di programmi con cui sono stati scritti, rendendo molto efficiente la fase di scrittura e lettura. Un esempio importante di questa tipologia di dati sono i file pickle, che consentono di memorizzare in file binari le strutture dati, anche molto complesse, sviluppate in python.

Man mano che i dati crescono di dimensioni, si possono utilizzare più file, dividendo i dati secondo un qualche criterio, per poi leggere, di volta in volta, i file richiesti dal calcolo desiderato. I limiti di questa strategia emergono quando i dati sono molto numerosi e quando esistono più criteri per dividerli, assegnandoli ai diversi file. Se il criterio di divisione dei dati nei vari file non è quello richiesto dal calcolo desiderato, può succedere di dover leggere molti file per estrarre da ciascuno solo pochi dati. Chiaramente questo processo può diventare molto oneroso in termini di tempo, rendendo una elaborazione, potenzialmente semplice, una attività ad alto assorbimento di risorse informatiche.
Esistono in questi casi due tipi di soluzioni:

  • utilizzo di un Database Management System (DBMS);
  • utilizzo di file con formati particolari che possono essere letti a parti, scegliendo di volta in volta solo la parte di interesse.

DBMS

Un DBMS è un programma che gestisce grandi quantità di dati strutturati e si fa carico di passare, di volta in volta, alla memoria centrale solo i dati che il programma in esecuzione richiede. Lo scambio avviene in questo modo: il programma in esecuzione fa una richiesta al DBMS, specificando, tramite un linguaggio dedicato1, quali dati gli sono necessari; il DBMS interpreta questa richiesta, estrae dalla memoria di massa i dati richiesti, e restituisce alla memoria centrale solo i dati oggetto della richiesta. Esistono vari tipi di DBMS che funzionano in modo diversi. Una distinzione importante è tra DBMS relazionali e DBMS NoSQL.

I DBMS binari organizzano i dati in modo da memorizzare ciascun dato in una sola posizione, senza mai ripeterlo. Considerate, ad esempio, l'indirizzo di un cliente e le fatture relative ai suoi acquisti. In un database relazionale, i dati relativi all'indirizzo del cliente saranno memorizzati in una tabella diversa da quelle delle sue fatture, creando una relazione (da qui il nome relazionale) tra le due tabelle. In questo modo non è necessario memorizzare l'indirizzo del cliente per ogni fatture emessa. Tra il software open source, i due DBMS relazionali più utilizzati sono MySQL e PostgreSQL

I DBMS NoSQL seguono una filosofia diversa, abbandonando l'obiettivo di memorizzare un dato in una unica posizione a vantaggio di una maggior flessibilità nella struttura dati. Un esempio di questa tipologia di DBMS è Mongodb, che può essere pensato come una grande collezione di documenti contenenti dati memorizzati utilizzando il formato json2. Tramite parole chiave inserite nei documenti è possibile estrarre i documenti di interesse e poi leggere i dati in essi contenuti.

File con formati particolari

Un file con formato particolare per la memorizzazione dati è generalmente composto di due parti. Nella prima parte sono mappati i dati contenuti nella seconda parte del file. In questo modo, quando un programma ha bisogno di leggere alcuni dati, legge la prima parte contenente la mappa, individua l'indirizzo preciso dove sono contenuti i dati necessari e quindi, in modo mirato, va a leggere i dati richiesti e solo questi. In questo modo riduce drasticamente i tempi necessari alla lettura dei dati necessari. Una tecnologia molto efficiente che utilizza file speciali per memorizzare i dati su memoria di massa è conosciuta con il nome di HDF5 (Hierarchical Data Format).

Tecnologia HDF5 e analisi sul commercio estero

HDF5 è una tecnologia che consente di memorizzare in un unico file una grande quantità di dati, concettualmente divisi tra file diversi e organizzati in una struttura gerarchica di cartelle. Il vantaggio di questa tecnologia è quello di poter estrarre i dati secondo le specifiche esigenze dell'analisi desiderata.
Consideriamo, ad esempio la banca dati di commercio estero Ulisse. Essa è relativa ai flussi annuali di commercio estero tra 152 paesi del mondo, per oltre 5000 prodotti, per il periodo 1995-2016. Per ciascun flusso di commercio estero essa contiene le misure del valore e delle quantità scambiate. Per semplicità consideriamo solo i flussi in valore misurato in euro. Questa banca dati è composta da oltre 2 miliardi di dati. Utilizzando la tecnologia HDF5 tutti questi dati sono memorizzati in un unico file. Da questo, con tempi di risposta dell'ordine di qualche secondo, è possibile, ad esempio, estrarre i dati per:

  • calcolare la dinamica della domanda mondiale di un prodotto, o per verificare quali paesi importatori hanno registrato negli ultimi anni i maggiori tassi di crescita, estraendo solo i dati relativi al prodotto di interesse;
  • verificare in quali prodotti un paese sta registrando le migliori performance, estraendo solo i dati del paese di interesse;
  • verificare quali prodotti sono maggiormente richiesti in un mercato, estraendo i dati relativi al solo mercato di interesse;
  • analizzare la dinamica delle importazioni complessive di un paese e la relazione esistente tra queste e lo sviluppo del paese, estrando i dati relativi all'incrocio prodotto-paese importatore;
  • studiare le diverse performance che un paese registra sui vari mercati e dedurre i suoi punti di forza e di debolezza, estraendo i dati relativi all'incrocio prodotto-paese esportatore;

Naturalmente l'estrazione dei dati necessari è solo la prima fase per lo sviluppo di una buona analisi. Se questa può essere fatta in tempi brevi e in modo preciso, allora si liberano spazi per percorrere non solo i percorsi di analisi più consolidati, ma anche percorsi contigui che, spesso, offrono preziose conoscenze aggiuntive.


1 Il linguaggio utilizzato per comunicare con i DBMS relazionali si chiama SQL.
2 I file in formato json possono essere considerati una evoluzione dei file csv; essi consentono infatti di gestire strutture dati composte sia da liste di valori (come i file csv) che da coppie chiave - valore.