Tengo un archivo csv de 7.4Gb. Después de convertirlo a una base de datos sqlite con un python script, el DB de salida es 4.7Gb, alrededor del 60% del tamaño original.¿sqlite3 comprime los datos?
El csv tiene alrededor de 150,000,000 filas. Tiene cabecera:
tkey,ipaddr,healthtime,numconnections,policystatus,activityflag
y cada fila se ve algo como
261846,172.10.28.15,2012-02-03 16:15:00,22,1,1
La secuencia de comandos utiliza healthtime para dividir los datos en tablas 192 mesas
Cuando vi por primera vez estos números, asumí que había cometido un error en algún lugar. ¿Qué tan grande de una reducción en el tamaño de archivo debo esperar de la eficacia adicional de solo escribir el tiempo de salud 192 veces en vez de 150,000,000 veces?
EDIT: Tan pronto como publiqué esto me di cuenta de la respuesta. Estoy eliminando aproximadamente el 40% de la cadena, por lo tanto, la reducción del 40% en el tamaño.
Editar 2 Vamos a calcular la diferencia de tamaño entre el texto:
"261846,172.10.28.15,2012-02-03 16:15:00,22,1,1"
Y la entrada de base de datos:
db(261846,'172.10.28.15',22,1,1)
En primer lugar, se nos cae de 46 a 26 caracteres en representación de texto sin formato.
Los caracteres restantes son:
"261846,172.10.28.15,22,1,1"
o 26 bytes. Si cada número entero necesita almacenarse en 32 bits (4 bytes), entonces tenemos:
12 bytes (ipaddr) + 4 bytes * 4 (campos enteros) = 28 bytes.
Parece que la conversión a enteros hace que el almacenamiento sea menos eficiente, y todas mis ganancias se obtienen reduciendo el número de caracteres almacenados en cada fila.
Obviamente sqlite es un formato binario, mientras que csv es texto. La diferencia de tamaño del 60% puede ser causada por eso. –
Disculpa, ¿qué es el tiempo de salud? Una búsqueda rápida en Google no generó nada. –
healthtime es solo el nombre del campo. – Maus