C'est une idée assez difficile à comprendre et j'apprécierais grandement toute modification / aide pour la rendre plus lisible pour ceux qui connaissent.
Est-il théoriquement possible d'avoir un disque dur qui a enregistré une copie de chaque permutation binaire possible d'un kilo-octet et que le reste du système crée simplement des pointeurs vers ces emplacements?
Un système conçu de cette manière serait-il plus rapide que de simplement stocker directement des informations?
Pour expliquer une autre façon, dites au lieu d'avoir des phrases:
"Bonjour, je m'appelle Bob." et "Ce sandwich a l'air délicieux."
... stockés sur le disque dur, nous aurions toutes les permutations de l'alphabet et d'autres caractères jusqu'à un certain nombre (disons, 1000 caractères environ), puis nous aurions stocké nos phrases comme quelque chose comme:
[Pointeur # 21381723]
la source
Réponses:
Il y a 2 8192 blocs 1K différents possibles. Les stocker tous nécessiterait 2 8202 bits de stockage. Étant donné que l'univers ne contient qu'environ 10 80 (ou ~ 2 266 ) particules, il y a fort à parier qu'il n'est pas possible de toutes les stocker, et vous n'avez pas à vous demander si cela gagnerait du temps ou non.
Mais il y a, en fait, une façon plus intéressante de répondre à cela. Vous proposez de créer un index dans un énorme pool de constantes. Mais comment sauriez-vous quel indice déréférencer? Imaginez l'intérêt d'un argument que vous souhaitez stocker uniquement des blocs 1 caractères:
a
,b
,c
... On peut supposer que vos indices seraient 0, 1, 2 , etc., puisque c'est la disposition la plus efficace de stocker ces blocs.Avez-vous remarqué quelque chose au sujet de l'arrangement? Votre index est, en fait, une représentation codée des données stockées ! En d'autres termes, vous n'avez pas du tout à déréférencer, il vous suffit de transformer l'index en données que vous souhaitez.
Lorsque vous stockez toutes les valeurs possibles de quelque chose dans une table, cela se produit toujours: votre index devient simplement une version codée des données elles-mêmes, donc le stockage des données devient inutile en premier lieu. Ce pourquoi , dans le monde réel, les indices ne sont utiles que pour les données rares (par exemple , toutes les pages Web que vous avez visités, toutes les pages Web qui pourraient exister , ou même tout ce qui ne existent).
la source
Comme d'autres l'ont déjà souligné, vous avez 2 ^ 8192 possibilités pour un bloc de 1k. Cela signifie que vous auriez besoin de 8192 bits pour coder l'adresse d'un bloc si toutes les adresses de blocs sont codées avec la même quantité de bits, de sorte que vos adresses auraient une longueur de 1k. Vous n'auriez rien gagné sauf l'ajout d'une couche d'indirection afin de ne gagner aucune performance.
Si vous voulez avoir des adresses plus courtes, vous devrez encoder certains blocs avec une adresse courte et certains avec des adresses plus longues et faire en sorte que les longs n'apparaissent pas souvent, et vous compressez maintenant simplement les données (probablement avec quelque chose comme un code Huffman ). Cela nécessiterait la connaissance des données que vous stockez avant de les stocker ou des changements réguliers dans l'encodage. Il serait également probablement moins efficace que d'autres algorithmes de compression qui utilisent des blocs de longueur variable.
la source
Il y a deux problèmes avec cela.
Premièrement, «toutes les permutations binaires possibles d'un kilo-octet» représentent une énorme quantité de données. 1024 octets * 8 bits par octet = 8192 bits en kilo-octet. Toutes les permutations possibles seraient 2 ^ 8192. C'est environ
1.09e+2466
kilo-octets! (À des fins de comparaison, un lecteur de 1 To équivaut à des1e09
kilo - octets.)Deuxièmement, même si vous aviez une table aussi énorme et que vous y étiez indexé avec des pointeurs, que feriez-vous si vous vouliez référencer des données inférieures à exactement 1 Ko?
la source
Comme d'autres affiches l'ont souligné, à un moment donné, la taille du pointeur nécessaire pour indexer dans votre liste toutes les valeurs possibles annule votre gain.
Cependant, certaines langues utilisent une version limitée de ce que vous proposez afin d'optimiser l'utilisation de la mémoire. Python utilise la chaîne «interning» pour réduire le nombre de chaînes en double en mémoire. Vous pouvez trouver plus d'informations en recherchant «intern chaîne de python».
la source