Ho circa 100000 righe di dati. Se memorizzo questi dati in un formato di file di testo, occupa più spazio rispetto a quando li memorizzo in un formato di file Excel. Perché?
Ho circa 100000 righe di dati. Se memorizzo questi dati in un formato di file di testo, occupa più spazio rispetto a quando li memorizzo in un formato di file Excel. Perché?
Risposte:
Il xlsx
formato utilizzato dal moderno Excel è in realtà un formato compresso. È un archivio ZIP che contiene file di testo (XML) in una determinata struttura.
Se comprimi il tuo file di testo semplice con uno strumento di compressione ZIP simile, dovresti ottenere dimensioni di file simili.
Inoltre, come menzionato da Bradley Uffner e Morgen nei commenti, Excel deduplicherà stringhe identiche e ne memorizzerà solo una copia. Non sono sicuro dei guadagni esatti di un tale metodo e dipenderà dal tuo set di dati, ma la semplice compressione zip ti porterà probabilmente la maggior parte del percorso lì. 1
9.1.3 Pacchetti fisici
Ogni documento Open XML di Office è implementato come un archivio ZIP.
1 La mia ipotesi è che questa deduplicazione sia più efficace quando si hanno più fogli di lavoro, poiché la compressione zip si applica indipendentemente a ciascun file in un archivio e solo su sezioni limitate dei dati alla volta - memorizzando tutte le stringhe insieme in un singolo file, lì dovrebbe essere un vantaggio per la compressione successiva. Più praticamente, se il tuo formato di testo semplice è comunque in un singolo file, probabilmente ci sarà poca differenza.
.zip
). Le specifiche sono anche disponibili, ma rendono la lettura piuttosto secca.
La risposta fornita è corretta, perché Excel archivia i tuoi dati come xml. È anche per questo che l'ordinamento efficiente dei dati ridurrà anche le dimensioni del file. Provalo tu stesso - supponi di avere dati come
A B C
John Smith-Johnson-Williamson 12345
Sally Smith-Johnson-Williamson 67890
John Williams 34567
Se ordini solo per C (una colonna con tutti o quasi tutti i valori univoci), i valori identici di B non saranno adiacenti. Nel file XML di Excel è simile al seguente:
<12345><John><Smith-Johnson-Williamson>
<34567><John><Williams>
<67890><Sally><Smith-Johnson-Williamson>
Se si ordina per B (una colonna con valori comuni), i valori identici sono adiacenti. Nel file XML di Excel è simile al seguente:
<Smith-Johnson-Williamson><John><12345>
<Sally><67890>
<Williams><John><34567>
Poiché quella lunga stringa è identica e adiacente, Excel sa che può raggrupparle insieme, in modo simile a quando le persone scrivono elenchi e per ripetere parte della riga precedente, digitano le virgolette anziché riscrivere la stessa cosa. Non ho trovato alcuna prova di un dizionario di stringa condivisa nella mia indagine - solo questa rientranza al posto del valore di campo ripetuto.
Avevo mailing list di 250.000 clienti in soli 11 stati e su ogni record c'era un campo che era una delle due stringhe che identificavano l'offerta. I nostri dipendenti erano per qualche motivo abituati a cercare le persone in base al loro indirizzo come pronunciato, quindi è stato ordinato sulla colonna del numero civico, quindi il nome della via, la città, ecc ... quando ho fatto ricorso prima all'offerta, quindi allo stato, codice postale, città, nome della via, numero civico e infine indirizzo-linea-2, la dimensione del file è stata ridotta incredibilmente. Ho esaminato l'xml decompresso sul file ordinato in ogni modo per vedere cosa stava succedendo, e quanto sopra è quello che ho dedotto. Se ci sono più campi con più di 5 caratteri, ma i valori sono di un set limitato (ad esempio, disposizioni di ticket come "risolto", "rifiutato", "approvato", ecc.),
Se hai un numero come 3.14159265359, hai bisogno di 13 byte per memorizzarlo in un file di testo; se si memorizza questo numero come float, sono necessari solo 4 byte.
xls
(BIFF), non credo che lo xlsx
faccia. xlsx
archivia tutti i dati in file XML, che non eseguono la codifica binaria dei numeri: vengono convertiti e archiviati come stringhe di testo. Sto ancora cercando di dare la caccia alla sezione pertinente della specifica, ma i miei test empirici (ovvero l'estrazione di un documento salvato) mostrano che 1.123
è letteralmente memorizzato come una stringa di 5 caratteri in XML.
c
(Cella) mostra che le celle memorizzano i loro dati in v
tag, come definito in ECMA-376-1: 2016 § 18.3.1.96 v
(Valore cella) dove dicono I possibili valori per questo elemento sono definiti dal tipo semplice ST_Xstring (§22.9.2.19). - forniscono esempi come <v>28086.3541666667</v>
dove i dati sono chiaramente memorizzati come una stringa.
xlsb
, che è altamente raccomandato per fogli enormi