Tengo alrededor de 100000 filas de datos. Si almaceno estos datos en un formato de archivo de texto, ocupa más espacio que si los almaceno en un formato de archivo de Excel. ¿Porqué es eso?
Tengo alrededor de 100000 filas de datos. Si almaceno estos datos en un formato de archivo de texto, ocupa más espacio que si los almaceno en un formato de archivo de Excel. ¿Porqué es eso?
Respuestas:
El xlsx
formato utilizado por Excel moderno es en realidad un formato comprimido. Es un archivo ZIP que contiene archivos de texto (XML) en una determinada estructura.
Si comprime su archivo de texto sin formato con una herramienta de compresión ZIP similar, debe lograr tamaños de archivo similares.
Además, como lo mencionaron Bradley Uffner y Morgen en los comentarios, Excel deduplicará cadenas idénticas y solo almacenará una copia de ellas. No estoy seguro de las ganancias exactas de un método de este tipo, y dependerá de su conjunto de datos, pero la simple compresión zip probablemente lo llevará a la mayor parte del camino. 1
9.1.3 Paquetes físicos
Cada documento de Office Open XML se implementa como un archivo ZIP.
1 Supongo que esta deduplicación es más efectiva cuando tiene varias hojas de trabajo, ya que la compresión zip se aplica de forma independiente a cada archivo en un archivo y solo en secciones limitadas de los datos a la vez, almacenando todas las cadenas juntas en un solo archivo. Debería haber algún beneficio para la compresión posterior. Más prácticamente, si su formato de texto plano está en un solo archivo de todos modos, entonces probablemente habrá poca diferencia.
.zip
). La especificación también está disponible, pero es una lectura bastante seca.
La respuesta dada es correcta, se debe a que Excel almacena sus datos como xml. También se debe a esto, que ordenar sus datos de manera eficiente también reducirá el tamaño del archivo. Pruébelo usted mismo: suponga que tiene datos como
A B C
John Smith-Johnson-Williamson 12345
Sally Smith-Johnson-Williamson 67890
John Williams 34567
Si ordena por C (una columna con todos o casi todos los valores únicos) solamente, los valores idénticos de B no serán adyacentes. En el xml de Excel se ve así:
<12345><John><Smith-Johnson-Williamson>
<34567><John><Williams>
<67890><Sally><Smith-Johnson-Williamson>
Si ordena por B (una columna con valores comunes), los valores idénticos son adyacentes. En el xml de Excel se ve así:
<Smith-Johnson-Williamson><John><12345>
<Sally><67890>
<Williams><John><34567>
Debido a que esa cadena larga es idéntica y adyacente, Excel sabe que puede agruparlos, de manera similar a cuando las personas escriben listas, y para repetir parte de la línea anterior, escriben comillas en lugar de volver a escribir lo mismo. No encontré ninguna evidencia de un diccionario de cadenas compartidas en mi investigación, solo esta sangría en lugar del valor de campo repetido.
Tenía listas de correo de 250,000 clientes en solo 11 estados, y en cada registro había un campo que era una de las dos cadenas que identificaban la oferta que recibían. Nuestros empleados, por alguna razón, estaban acostumbrados a buscar a las personas por su dirección de la calle tal como se hablaba, por lo que se ordenó en la columna del número de la calle, luego el nombre de la calle, la ciudad, etc. código postal, ciudad, nombre de la calle, número de la calle y finalmente dirección-línea-2, el tamaño del archivo se redujo increíblemente. Examiné el xml desempaquetado en el archivo ordenado en cada sentido para ver qué estaba pasando, y lo anterior es lo que deduje. Si hay varios campos con más de 5 caracteres, pero los valores son de un conjunto limitado (por ejemplo, disposiciones de tickets como 'resuelto', 'rechazado', 'aprobado', etc.),
Si tiene un número como 3.14159265359, necesita 13 bytes para almacenarlo en un archivo de texto; Si almacena este número como flotante, solo necesita 4 bytes.
xls
(BIFF), no creo que lo xlsx
haga. xlsx
almacena todos los datos en archivos XML, que no realizan codificación binaria de números; se convierten y almacenan como cadenas de texto. Todavía estoy tratando de buscar la sección relevante de la especificación, pero mi prueba empírica (es decir, extraer un documento guardado) muestra que 1.123
se almacena literalmente como una cadena de 5 caracteres en XML.
c
(Celda) muestra que las celdas almacenan sus datos en v
etiquetas, tal como se define en ECMA-376-1: 2016 § 18.3.1.96 v
(Valor de celda) donde dicen Los valores posibles para este elemento están definidos por el tipo simple ST_Xstring (§22.9.2.19). - proporcionan ejemplos como <v>28086.3541666667</v>
dónde los datos se almacenan claramente como una cadena.
xlsb
, que es muy recomendable para grandes hojas