Algoritmo de clasificación para Excel / SharedStrings

10

En Excel, 'comprimen' cadenas a una asignación numérica (aunque no estoy seguro de que la palabra comprimir sea correcta en este caso). Aquí hay un ejemplo que se muestra a continuación:

ingrese la descripción de la imagen aquí

Si bien esto ayuda a reducir el tamaño general del archivo y la huella de la memoria, ¿cómo hace Excel la clasificación en un campo de cadena? ¿Debería cada cadena pasar por el mapeo de búsqueda? Y si es así, ¿no aumentaría en gran medida el costo de / ralentizar la ordenación en un campo de cadena? trivial). Dos preguntas sobre esto:

  1. ¿Se utilizan cadenas compartidas dentro de la propia aplicación de Excel, o solo al guardar los datos?
  2. ¿Cuál sería un algoritmo de ejemplo para ordenar en el campo entonces? Cualquier lenguaje está bien (c, c #, c ++, python).
David542
fuente
Estaré interesado en una respuesta bien informada a esto también. Solo puedo adivinar que tiene algo que ver con el almacenamiento en caché de memoria, pero puede estar equivocado fácilmente.
PeterT
Creo que el hecho de que este mapeo exista en la representación física XML de un documento es independiente de cómo Excel representa internamente los datos en tiempo de ejecución. Creo que es más eficiente computacionalmente representar columnas de datos sin procesar (aunque esto podría hacerse de muchas maneras).
Alxrcs
@alxrcs ¿hay algún documento o libro que vaya a lo interno de Excel, similar a algo como esto para SQLServer? amazon.com/Pro-Server-Internals-Dmitri-Korotkevitch/dp/… , ¿o es básicamente una caja negra fuera del equipo de ms?
David542
No estoy seguro, lo siento. Puede encontrar en línea algunas especificaciones para los formatos de archivo, pero no creo que los detalles sobre el tiempo de ejecución de Excel sean tan fáciles de encontrar.
alxrcs
De todos modos, desde su segunda pregunta, sospecho que está más interesado en la teoría que en los detalles de Excel, ¿es así?
alxrcs

Respuestas:

0

No puedo encontrar exactamente cómo Excel almacena las celdas con SharedStringTableelementos en la memoria en tiempo de ejecución, pero almacenarlas como un índice del elemento SharedStringTablerequiere solo una desreferencia adicional para acceder a ellas, suponiendo que los elementos se almacenen como una matriz. Entonces supongo que así es como se hace. Esa es la forma más simple y la única forma de hacerlo más rápido es tener una representación en tiempo de ejecución de SharedStringTableelementos ya ordenados. En tal caso, ordenar por un índice es equivalente a ordenar por el valor. Sin embargo, ese enfoque hace que la operación de inserción sea costosa, ya que cuando se inserta una nueva cadena en el centro de la tabla, todos los índices son más grandes de lo que debería incrementarse y el número de celdas en el documento puede ser muy grande, hasta todos células que se refieren a SharedStringTable.

Si las celdas contienen índices iguales que en el archivo, así es como se ordenarían las celdas representadas por columnValuevector en función de las cadenas a las que apuntan almacenadas en el sharedStringsvector (en C ++ ya que usted dijo que no hay diferencia) a un costo de 2 desreferencias adicionales por operación de comparación:

// sort indexes from columnValue based on comparing values in sharedStrings
sort(columnValue.begin(), columnValue.end(), 
     [&sharedStrings](size_t i1, size_t i2){return sharedStrings[i1] < sharedStrings[i2];});

No estaba en el OP, pero la SharedStringTableoperación de búsqueda inversa es lenta y el almacenamiento en caché de elementos en un diccionario ayuda.

isp-zax
fuente
0

Tabla de cadenas compartidas de Microsoft Excel

La tabla de cadenas compartidas es un estándar Open XML, según lo define el estándar ISO - ISO / IEC 29500-1: 2016 (E)

Definición oficial de cadenas compartidas (citado del documento ISO)

Tabla de cadenas compartidas

Los valores de cadena se pueden almacenar directamente dentro de los elementos de celda de la hoja de cálculo; sin embargo, almacenar el mismo valor dentro de múltiples elementos de celda puede resultar en partes de hoja de trabajo muy grandes, posiblemente resultando en una degradación del rendimiento. La tabla de cadenas compartidas es una lista indexada de valores de cadenas, compartida en todo el libro, que permite que las implementaciones almacenen valores solo una vez.

El estándar ISO en cadenas compartidas se puede descargar desde

https://standards.iso.org/ittf/PubliclyAvailableStandards/c071691_ISO_IEC_29500-1_2016.zip

Respuestas a las preguntas sobre este tema.

Pregunta 1: ¿Se utilizan cadenas compartidas dentro de la propia aplicación de Excel, o solo al guardar los datos?

Respuesta: Excel utiliza las cadenas compartidas solo al momento de guardar el documento, IE, solo con el propósito de almacenar la hoja de cálculo como un archivo en el almacenamiento.

Sin embargo, cuando el archivo se abre para su visualización, las celdas se rellenan con valores de cadena reales extraídos de la tabla de cadenas compartidas.

-

Pregunta 2: ¿Cuál sería un algoritmo de ejemplo para ordenar en el campo entonces? Cualquier lenguaje está bien (c, c #, c ++, python).

Respuesta: Para una aplicación como Excel, supongo que una variación patentada especial de ordenación rápida es el algoritmo más probable que se utilizará para ordenar los valores de cadena.

Excel tiene un límite de 1,048,576 filas. Para este tamaño, Quick sort es definitivamente un ganador. La ordenación rápida puede producir resultados muy eficientes para un conjunto de datos de esta magnitud.

Aquí está el enlace a la implementación de Quick Sort en C ++ para ordenar cadenas:

http://www.cplusplus.com/forum/beginner/101599/

Gopinath
fuente
2
la ordenación rápida estaría en la misma cadena, sin embargo, tendría que desreferenciar un puntero o hacer un mapa de búsqueda un millón de veces, ¿no? Creo que esta respuesta es básicamente decir "Sí, hace cadenas compartidas. Aquí se explica cómo hacer una ordenación sin cadenas compartidas".
David542
2
La tabla de cadenas compartidas se usa solo para almacenar el contenido del archivo en el disco. El estándar ISO no especifica cómo deben rellenarse las celdas cuando la aplicación está abierta. Si las celdas se rellenan con una copia del valor de cadena extraída de la tabla de cadenas compartidas, se puede evitar la desreferenciación.
Gopinath
1
Veo. Sí, mi principal punto de interés aquí fue cómo se maneja en la memoria, fuera del aspecto de almacenamiento desde / hacia. ¿Tienes alguna idea de esa parte?
David542
En la clasificación de Excel, el usuario debe especificar el orden de clasificación como una lista de columnas (Ejemplo: Ordenar por Columna A, Luego por B, Luego por C, Luego por D). Suponga que la columna A contiene cadenas duplicadas. Durante la ordenación, todas las filas con el mismo valor para la columna A se ordenarán según los valores de 'Columna B'. Si las celdas de B también contienen valores duplicados, la clasificación se realizará en la Columna C ... y así sucesivamente hasta que se encuentre la columna con valores únicos. Si ninguna de las columnas tiene valores únicos, se omitirán las filas.
Gopinath