Colección de citas famosas - Colección de consignas - Este artículo analiza los principios de almacenamiento de datos de imágenes y texto de gran tamaño en bases de datos.

Este artículo analiza los principios de almacenamiento de datos de imágenes y texto de gran tamaño en bases de datos.

Principios para almacenar datos de imágenes en bases de datos;

XML es una estructura de intercambio de datos basada en texto, que es muy conveniente para el intercambio de texto de tipo carácter. En el trabajo real, a menudo necesitamos intercambiar gráficos y datos de información de imágenes en formato binario a través de XML. Se introduce el principio de codificación BASE64 y el procedimiento almacenado integrado de DB2 está escrito en lenguaje C, que realiza la conversión de archivos de imagen en formato de texto y campos BLOB binarios en la memoria de la base de datos, y presenta algunas sugerencias para la optimización del rendimiento. Esta idea de diseño y programa se pueden utilizar ampliamente en el almacenamiento XML y la conversión de datos de imágenes y gráficos.

-

Volver al principio

Principios básicos del uso de XML para almacenar gráficos e imágenes

XML es un intercambio de datos muy extenso Carrier se ha utilizado ampliamente en el intercambio de datos en todos los ámbitos de la vida. Para la conversión de datos de imágenes gráficas, se debe utilizar la codificación Base64 para convertir la información de la imagen gráfica en formato binario a formato de texto y luego transmitirla.

La idea de la conversión de código Base64 es volver a codificar y combinar datos binarios mediante códigos de 64 caracteres ASCII, es decir, agrupar los datos que se deben convertir cada tres bytes (24 bits), y luego convierte los datos de 24 bits. Se vuelve a dividir según cada grupo de 6 bits, y los 2 bits más altos de cada grupo se llenan con 0, formando finalmente un byte completo de 8 bits. Si el número de bytes de los datos que se van a codificar no es un múltiplo entero de 3, debe completar de 1 a 2 bytes de 0 bytes en el último conjunto de datos. Por ejemplo, usamos BASE64 para codificar ABC, y los valores codificados de ABC son A (65), B (66) y C (67). Luego toma los números binarios A (0100001) B (01000010) C (01000011) y concatenalos para formar 01000000658.8+0, luego divídelo en cuatro bloques de datos en unidades de 6 bits y llena el bit más alto con dos ceros para formar un 4. -Valor codificado en bytes (00010000) (00010100) (00001001) (000000001). Luego convierta los 4 bytes de datos en números decimales (16) (20) (19) (3). Finalmente, de acuerdo con las tablas de 64 caracteres básicos proporcionadas por BASE64, busque los caracteres ASCII correspondientes (Q) (U) (J) (D). El valor aquí es en realidad el índice de los datos en la tabla de caracteres.

Tabla de caracteres BASE64:

abcdefghijklmnopqrstuvwxyzabbcdefghijklmnopqrstuvwxyz 0123456789.

El intercambio de datos del proyecto utiliza XML como medio. La estructura de XML incluye información personal básica, como nombre, sexo, foto, etc. Entre ellos, la información de la fotografía son datos de texto convertidos a través de la función BASE64. La información de imagen y gráfica se convierte a través de BASE64 para formar un tipo de datos de formato de texto, y luego los datos correspondientes se almacenan en XML, formando finalmente una estructura de datos XML de texto intercambiable. .

La estructura de datos de XML es la siguiente:

& lt? versión xml = "1.0" codificación = "UTF-8"? & gt

& ltHeadInfo & gt

& ltTotalNum & gt10 & lt;TotalNum & gt

& ltTransDate & gt2007-10-18/trans date & gt ;

& lt/head info & gt;

& ltdata& gt

& ltNombre & gtZhang San

& lt Sexo>Men《/ Sexo>

& ltPhoto>/9j/4a aqskzjrgagabaqaaaqabaad......& lt/Photo>

& ltdata & gt

-

Volver al principio

Implementación de datos fotográficos en el programa C integrado DB2

Este proyecto requiere que los datos fotográficos se puedan almacenar en la base de datos DB2 en formato BLOB binario.

Usamos DATASTAGE para cargar datos XML, cargar elementos de datos básicos como nombre y género en XML en los campos correspondientes, y cargar datos de fotografías basados ​​en texto en campos CLOB, y luego realizar la transcodificación inversa de acuerdo con las reglas de codificación de BASE64. El flujo de datos completo se muestra en la siguiente figura:

Figura 1. Diagrama de flujo de almacenamiento de fotografías

Los datos actualizados de las fotografías de los usuarios son 300.000 por día, con un promedio de más de 32 KB por foto. Para un rendimiento óptimo de la base de datos, se desarrollaron funciones de conversión BASE64 utilizando procedimientos almacenados en C. Cada vez que una función lee datos en formato de texto almacenados en un campo CLOB, los datos se almacenan en la memoria, la función de decodificación los transcodifica en la memoria y luego se almacenan en la base de datos.

El Listado 1 del programa lee el campo CLOB línea por línea y llama a la función de decodificación para la transcodificación; el Listado 2 del programa es el código clave de la función de decodificación. Consulte la sección de descarga del código fuente para ver el programa completo.

Listado 1. Leer en CLOB y escribir en el campo BLOB.

Parte EXEC SQL BEGIN DECLARE;

El tipo SQL es CLOB (100K) clobResume; //Variable de estructura CLOB

El tipo SQL es BLOB (100K) BLOB resume ;//Variable de estructura BLOB

sqlint 16 bobind;

sqlint 16 lobind;

sqlint 16 cobind;

sqlint32 idValue p>

EXEC SQL END DECLARE part;

int clob 2 bin (void)

{

//Declarar la estructura SQLCA

Estructura sqlca;

int charNb

int lineNb

Longitud n;

n = 0;

//Definir el cursor de la base de datos

EXEC SQL declara el cursor c1 y lo retiene

Seleccione czrkxp_a

DESDE CZRK_blob para actualizar;

EXEC SQL OPEN c 1;

//La información del campo CLOB activo ya tiene el tamaño del campo CLOB.

EXEC SQL extrae c1 a:clobResume:cobind;

// Lea libremente el campo CLOB y llame a la función de transcodificación de decodificación.

mientras (sqlca . sqlcode != 100)

{

if (cobind <0)

{

printf("Indica LOB vacío.\n ");

}

Otro

{

n++;

p>

decode(); // Función de conversión de código de formato de texto a secuencia binaria

printf("\ncurrent line=%ld",n);

// Los datos se escriben en el campo BLOB.

Actualización EXEC SQL czrk _ blob set czrkxp _ blob =:blob sume

Donde la corriente es c 1;;

//Commit transacción

Envío EXEC SQL;

}

Extracción EXEC SQL c1 a: clobResume:cobind;

}

// Cerrar cursor

EXEC SQL CLOSE c 1;

COMPROMISO EXEC SQL;

Devuelve 0;

}

Listado 2.

Conversión de archivo de texto a archivo binario

Decodificación no válida (no válida)

{

Caracteres sin firmar en[4], salida[3], v;

int I, len

long j, k;

j =-1;

k = 0; //Convierte los datos leídos en variables de estructura CLOB.

while (j & lt; clob resume . length ) {

for (len = 0, I = 0; i & lt4 & amp& amp (j & ltclobresume . length); i++ ) {

v = 0;

mientras ((j & lt; clobResume.length) y amp& ampv == 0 ) {

j++; /p>

v = (carácter sin firmar) clobresume . datos [j];

v = (carácter sin firmar) ((v & lt43 | | v & gt122) ?0:cd64[v – 43]);

If (5) {

v = (carácter sin signo) ((v = ='$')? 0:v–61);

p>

}

}

if (j & lt; clob resume . length ) {

len++; (5) {

en[I]= (carácter sin firmar) (v–1);

}

}

De lo contrario {

en【I】= 0;

}

}

si (len) {

Bloque de decodificación (entrada, salida);

//Escribe variable de estructura BLOB.

for (I = 0; i & ltlen–1; i++) {

datos de resumen de blob[k] = out[I]; ;

}

}

}

longitud del currículum blob = k;

}

-

Volver al principio

Eficiencia de conversión de datos y sugerencias de optimización

Este programa se ejecuta en el servidor de base de datos IBM P570 y la eficiencia de ejecución es muy alto y ha sido probado en varios órdenes de magnitud. La eficiencia de conversión promedio final de la prueba es: cada 65,438+0,000 registros de datos, la eficiencia de conversión es de 55 segundos, es decir, 65,438+0,82 entradas/segundo. Vale la pena señalar que todo el proceso de conversión no ocupa una cantidad particularmente grande de CPU. El principal cuello de botella en el rendimiento es la matriz de discos.

En el futuro, los siguientes aspectos se pueden optimizar aún más para garantizar una mayor eficiencia de conversión del programa:

1) Utilice métodos de llamada multiproceso para obtener una mayor concurrencia;

2) Confirmar transacciones cada 10 o 100 veces para reducir el número de accesos al disco;

3) Colocar CLOB y BLOB en diferentes espacios de tablas y distribuir los espacios de tablas en varios discos para lograr una velocidad de acceso al disco óptima .