Algorithme de tri pour Excel / SharedStrings

10

Dans Excel, ils «compressent» les chaînes en un mappage numérique (même si je ne suis pas sûr que le mot compresser soit correct dans ce cas). Voici un exemple ci-dessous:

entrez la description de l'image ici

Bien que cela aide à réduire la taille globale du fichier et l'empreinte mémoire, comment Excel fait-il le tri sur un champ de chaîne? Est-ce que chaque chaîne aurait besoin de passer par le mappage de recherche: et si c'est le cas, cela n'augmenterait-il pas considérablement le coût / le ralentissement du tri sur un champ de chaîne (et s'il y avait 1 M de valeurs, les recherches de clés de 1 M ne seraient pas banal). Deux questions à ce sujet:

  1. Les chaînes partagées sont-elles utilisées dans l'application Excel elle-même, ou uniquement lors de l'enregistrement des données?
  2. Quel serait alors un exemple d'algorithme pour trier sur le terrain? Tout langage est parfait (c, c #, c ++, python).
David542
la source
Je serais également intéressé par une réponse éclairée à cette question. Je peux seulement deviner que cela a quelque chose à voir avec la mise en cache de la mémoire, mais peut facilement être faux.
PeterT
Je pense que le fait que ce mappage existe dans la représentation XML physique d'un document est indépendant de la façon dont Excel représente en interne les données lors de l'exécution. Je pense qu'il est plus efficace en termes de calcul de représenter des colonnes de données de manière brute (bien que cela puisse être fait de plusieurs manières).
alxrcs
@alxrcs y a-t-il des documents ou des livres qui entrent dans les internes d'Excel, similaires à quelque chose comme ça pour SQLServer? amazon.com/Pro-Server-Internals-Dmitri-Korotkevitch/dp/… , ou s'agit-il essentiellement d'une boîte noire en dehors de l'équipe ms?
David542
Pas sûr, désolé. Vous pouvez trouver en ligne certaines spécifications pour les formats de fichiers, mais je ne pense pas que les détails sur les composants internes d'exécution d'Excel soient aussi faciles à trouver.
alxrcs
Quoi qu'il en soit, d'après votre deuxième question, je suppose que vous êtes plus intéressé par la théorie que par les spécificités d'Excel, n'est-ce pas?
alxrcs

Réponses:

0

Je ne peux pas trouver exactement comment Excel stocke les cellules avec SharedStringTable éléments en mémoire au moment de l'exécution, mais leur stockage en tant qu'index de l'élément dans SharedStringTablenécessite seulement une déréférence supplémentaire pour y accéder, en supposant que les éléments sont stockés sous forme de tableau. Donc, je suppose que c'est ainsi que cela se fait. C'est le moyen le plus simple et le seul moyen de l'accélérer est d'avoir une représentation d'exécution SharedStringTabledéjà triée par éléments. Dans ce cas, le tri par index équivaut au tri par valeur. Cette approche, cependant, rend l'opération d'insertion coûteuse comme lorsqu'une nouvelle chaîne est insérée au milieu du tableau, tous les index plus grands qu'il ne devrait être incrémenté et le nombre de ces cellules dans le document peut être très grand, jusqu'à tous les cellules se référant à SharedStringTable.

Si les cellules contiennent des index identiques à ceux du fichier, voici comment trier les cellules représentées par columnValue vecteur en fonction des chaînes vers lesquelles elles pointent stockées dans le sharedStringsvecteur (en C ++ puisque vous avez dit qu'il n'y a pas de différence) au coût de 2 déréférences supplémentaires par opération de comparaison:

// 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];});

Ce n'était pas dans l'OP, mais l' SharedStringTableopération de recherche inversée est lente et la mise en cache des éléments dans un dictionnaire aide.

isp-zax
la source
0

Tableau des chaînes partagées Microsoft Excel

La table des chaînes partagées est et la norme Open XML, telle que définie par la norme ISO - ISO / IEC 29500-1: 2016 (E)

Définition officielle des chaînes partagées (citée dans le document ISO)

Table de chaînes partagée

Les valeurs de chaîne peuvent être stockées directement à l'intérieur des éléments de cellule de feuille de calcul; cependant, le stockage de la même valeur dans plusieurs éléments de cellule peut entraîner des pièces de feuille de calcul très volumineuses, ce qui peut entraîner une dégradation des performances. La table de chaînes partagée est une liste indexée de valeurs de chaîne, partagée dans le classeur, qui permet aux implémentations de stocker les valeurs une seule fois.

La norme ISO sur les chaînes partagées peut être téléchargée à partir de

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

Réponses aux questions sur ce sujet

Question 1: les chaînes partagées sont-elles utilisées dans l'application Excel elle-même, ou uniquement lors de l'enregistrement des données?

Réponse: Les chaînes partagées sont utilisées par Excel uniquement au moment de l'enregistrement du document, IE, uniquement dans le but de stocker la feuille de calcul en tant que fichier sur le stockage.

Toutefois, lorsque le fichier est ouvert pour l'affichage, les cellules sont remplies avec des valeurs de chaîne réelles extraites de la table des chaînes partagées.

-

Question 2: Quel serait alors un exemple d'algorithme pour trier sur le terrain? Tout langage est parfait (c, c #, c ++, python).

Réponse: Pour une application comme Excel, je suppose qu'une variante propriétaire spéciale du tri rapide est l'algorithme le plus susceptible d'être utilisé pour trier les valeurs de chaîne.

Excel a une limite de 1 048 576 lignes. Pour cette taille, le tri rapide est définitivement un gagnant. Le tri rapide peut produire un résultat très efficace pour un ensemble de données de cette ampleur.

Voici le lien vers l'implémentation du tri rapide en C ++ pour trier les chaînes:

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

Gopinath
la source
2
le tri rapide serait sur la chaîne elle-même, vous auriez besoin de déréférencer un pointeur ou de faire une carte de recherche un million de fois, non? Je pense que cette réponse dit simplement "Oui, il fait des chaînes partagées. Voici comment faire un tri sans chaînes partagées".
David542
2
La table des chaînes partagées est utilisée uniquement pour stocker le contenu du fichier sur le disque. La norme ISO ne spécifie pas comment les cellules doivent être remplies lorsque l'application est ouverte. Si les cellules sont remplies avec une copie de la valeur de chaîne extraite de la table des chaînes partagées, le déréférencement peut être évité.
Gopinath
1
Je vois. Oui, mon principal intérêt ici était de savoir comment il est géré en mémoire, en dehors de l'aspect to / from-storage. Avez-vous une idée de cette partie?
David542
Dans le tri Excel, l'utilisateur doit spécifier l'ordre de tri sous forme de liste de colonnes (Exemple: Trier par colonne A, puis par B, puis par C, puis par D). Supposons que la colonne A contienne des chaînes en double. Lors du tri, toutes les lignes ayant la même valeur pour la colonne A seront triées sur les valeurs de la «colonne B». Si les cellules de B contiennent également des valeurs en double, le tri sera effectué sur la colonne C ... jusqu'à ce que la colonne avec des valeurs uniques soit trouvée. Si aucune des colonnes n'a de valeurs uniques, les lignes seront ignorées.
Gopinath