2010-10-26 13 views
6

Recentemente ho trovato Pytables e lo trovo molto interessante. È chiaro che sono superiori a un formato CSV per set di dati molto grandi. Sto facendo delle simulazioni usando python. L'output non è così grande, diciamo 200 colonne e 2000 righe.Pytables vs. CSV per file che non sono molto grandi

Se qualcuno ha esperienza con entrambi, puoi suggerire quale formato sarebbe più conveniente a lungo termine per tali set di dati che non sono molto grandi. Pytables ha funzionalità di manipolazione dei dati e la navigazione dei dati con Vitables, ma il browser non ha tante funzionalità come, ad esempio, Excel, che può essere utilizzato per CSV. Allo stesso modo, ne trovi uno migliore rispetto all'altro per l'importazione e l'esportazione di dati, se lavori principalmente in python? È più conveniente in termini di organizzazione dei file? Eventuali commenti su problemi come questi sarebbero utili.

Grazie.

+1

Probabilmente dipende da ciò che si sta facendo con i dati, cioè come si definisce convenienza. Volete 1. Volete visualizzare i dati con un buon editor visuale quando volete 2. Forse controllare i dati una volta visivamente e poi passarli ad un altro programma? Se vuoi il primo e hai bisogno di quella funzionalità per "vedere" i dati, allora il formato csv non è probabilmente una cattiva scelta. Dato 2, pytables è probabilmente buono. In entrambi i casi, i dati sono piccoli, perché non salvarli entrambi? – Marm0t

risposta

5

Avete considerato gli array di Numpy?

PyTables è meraviglioso quando i dati sono troppo grandi per adattarsi alla memoria, ma una matrice 200x2000 di 8 byte mobili richiede solo circa 3 MB di memoria. Quindi penso che PyTables potrebbe essere eccessivo.

È possibile salvare le matrici NumPy ai file utilizzando np.savetxt o np.savez (per la compressione), e li potete leggere da file con np.loadtxt o np.load.

Se molti array di questo tipo sono archiviati su disco, suggerirei di utilizzare un database anziché i file numpy .npz. Tra l'altro, per memorizzare una matrice di 200x2000 in un database, è necessario solo 3 colonne della tabella: riga, colonna, valore:

import sqlite3 
import numpy as np 

db = sqlite3.connect(':memory:') 
cursor = db.cursor() 
cursor.execute('''CREATE TABLE foo 
        (row INTEGER, 
        col INTEGER, 
        value FLOAT, 
        PRIMARY KEY (row,col))''') 
ROWS=4 
COLUMNS=6 
matrix = np.random.random((ROWS,COLUMNS)) 
print(matrix) 
# [[ 0.87050721 0.22395398 0.19473001 0.14597821 0.02363803 0.20299432] 
# [ 0.11744885 0.61332597 0.19860043 0.91995295 0.84857095 0.53863863] 
# [ 0.8.52689885 0.05861043 0.71784406 0.20222138 0.63094807] 
# [ 0.01309897 0.45391578 0.04950273 0.93040381 0.41150517 0.66263562]] 

# Store matrix in table foo 
cursor.executemany('INSERT INTO foo(row, col, value) VALUES (?,?,?) ', 
        ((r,c,value) for r,row in enumerate(matrix) 
           for c,value in enumerate(row))) 

# Retrieve matrix from table foo 
cursor.execute('SELECT value FROM foo ORDER BY row,col') 
data=zip(*cursor.fetchall())[0] 
matrix2 = np.fromiter(data,dtype=np.float).reshape((ROWS,COLUMNS)) 
print(matrix2) 
# [[ 0.87050721 0.22395398 0.19473001 0.14597821 0.02363803 0.20299432] 
# [ 0.11744885 0.61332597 0.19860043 0.91995295 0.84857095 0.53863863] 
# [ 0.8.52689885 0.05861043 0.71784406 0.20222138 0.63094807] 
# [ 0.01309897 0.45391578 0.04950273 0.93040381 0.41150517 0.66263562]] 

Se si dispone di molti di questi 200x2000 matrici, basta un'altra colonna della tabella per specificare quale matrice.

+0

Sembra interessante. Non so molto sui database, ma esaminerò questo e pubblicheremo. Ciò che non mi è chiaro dal tuo esempio è che in che modo le coordinate di ciascun valore nella matrice di 2000 righe x 200 colonne vengono assegnate alla tabella del database. Proverò a capirlo. – Curious2learn

+0

Non penso che userò una colonna separata 'id' per la chiave primaria. la riga/colonna rende una chiave primaria molto migliore, poiché è davvero l'identificazione per quel bit di dati. per una matrice 2000x2000, potresti persino essere intelligente e impacchettare sia la riga che la colonna nella stessa colonna intera, qualcosa come 'row << 16 + col'. – SingleNegationElimination

+0

@TokenMacGuy: Grazie! – unutbu

0

Queste non sono scelte "esclusive".

Avete bisogno di entrambi.

CSV è solo un formato di scambio dati. Se usi pytables, devi comunque importarlo ed esportarlo in formato CSV.

+0

Potete per favore elaborare? Non ho bisogno di creare file CSV per usare pytables. Grazie! – Curious2learn

+0

È necessario creare CSV per scambiare dati con applicazioni che accettano solo CSV. Fogli di calcolo, per esempio. –

2

Per quanto riguarda l'importazione/esportazione, PyTables utilizza un formato di file standardizzato denominato HDF5. Molti pacchetti software scientifici (come MATLAB) hanno il supporto integrato per HDF5 e l'API C non è terribile. Quindi qualsiasi dato che devi esportare o importare in una di queste lingue può essere semplicemente conservato nei file HDF5.

PyTables aggiunge alcuni attributi propri, ma questi non dovrebbero farti male. Ovviamente, se archivi oggetti Python nel file, non sarai in grado di leggerli altrove.

L'unica cosa bella dei file CSV è che sono leggibili. Tuttavia, se hai bisogno di memorizzare qualcosa di diverso da semplici numeri e comunicare con gli altri, avrai dei problemi. Ricevo file CSV da persone di altre organizzazioni e ho notato che gli umani non sono bravi a fare in modo che le cose come il citare le stringhe siano fatte correttamente. È positivo che il parser CSV di Python sia flessibile così com'è. Un altro problema è che i numeri in virgola mobile non possono essere memorizzati esattamente nel testo utilizzando il formato decimale. Di solito è abbastanza buono, però.

+0

Grazie per il feedback! Diresti che con ViTables, anche PyTables diventa leggibile dall'uomo. – Curious2learn

+0

ViTables è fantastico. MA, è qualcosa di doloroso da installare (fino a poco tempo fa). –

+0

floats * può * essere memorizzato esattamente in formato ASCII decimale, ma richiede un numero di cifre decimali sufficiente per farlo. Questo spesso non è l'impostazione predefinita per la formattazione delle stringhe dei float, comunque. – SingleNegationElimination

1

penso sia molto difficile per comapre pytables e csv .. pyTable è una struttura dati ehile CSV è un formato di scambio per i dati.

1

Questo è in realtà abbastanza legata a un'altra risposta che ho fornito per quanto riguarda i file CSV di lettura/scrittura w/NumPy:

Python: how to do basic data manipulation like in R?

Si dovrebbe sicuramente uso NumPy, non importa che cosa! La facilità di indicizzazione, ecc., Supera di gran lunga il costo della dipendenza aggiuntiva (beh, penso di sì). PyTables, ovviamente, si affida anche a Numpy.

Altrimenti, dipende molto dall'applicazione, dall'hardware e dal pubblico. Sospetto che leggere in file CSV delle dimensioni di cui parli non abbia importanza in termini di velocità rispetto a PyTables. Ma se è una preoccupazione, scrivi un punto di riferimento! Leggi e scrivi alcuni dati casuali 100 volte. Oppure, se i tempi di lettura contano di più, scrivi una volta, leggi 100 volte, ecc.

Ho il forte sospetto che PyTables supererà l'SQL. SQL farà rock su query multi-table complesse (specialmente se fai spesso le stesse cose), ma anche su table table a tabella singola (chiamate "denormalizzate"), pytables è difficile da battere in termini di velocità. Non riesco a trovare un punto di riferimento per questo fuori mano, ma si può essere in grado di scavare qualcosa se si miniera i link qui:

http://www.pytables.org/moin/HowToUse#HintsforSQLusers

Sto indovinando eseguire prestazioni per voi in questa fase sarà pallido in confronto alle prestazioni del programmatore. Quindi, soprattutto, scegli qualcosa che abbia più senso per te!

Altri punti:

Come con SQL, PyTables dispone di una funzione di undo. I file CSV non avranno questo, ma puoi mantenerli nel controllo della versione, e non devi essere VCS troppo intelligente (i file CSV sono testo).

Su una nota correlata, i file CSV saranno molto più grandi dei formati binari (è possibile scrivere i propri test anche per questo).

2

Un grande vantaggio per PyTables è l'archiviazione di metadati, come variabili ecc.

Lo usiamo per memorizzare i dati di misurazione + gli script di esperimento per ottenere i dati in modo che siano tutti autonomi.

BTW: Se è necessario esaminare rapidamente un file hdf5, è possibile utilizzare HDFView. È un'applicazione Java gratuita da HDFGroup. È facile da installare.

Problemi correlati