Dies ist eine schwierige Idee, die mir den Kopf zerbrechen lässt, und ich würde mich sehr über Änderungen / Hilfen freuen, um sie für Kenner besser lesbar zu machen.
Ist es theoretisch möglich, eine Festplatte zu haben, auf der eine Kopie jeder möglichen binären Permutation von einem Kilobyte gespeichert ist, und dann vom Rest des Systems einfach Zeiger auf diese Speicherorte zu erstellen?
Wäre ein solches System schneller als die direkte Speicherung von Informationen?
Um einen anderen Weg zu erklären, sagen Sie, anstatt Sätze zu haben:
"Hallo, ich bin Bob." und "Das Sandwich sieht köstlich aus."
... auf der Festplatte gespeichert, haben wir alle Permutationen des Alphabets und andere Zeichen bis zu einer bestimmten Zahl (z. B. 1000 Zeichen oder so) und haben dann unsere Sätze als so etwas wie gespeichert:
[Zeiger # 21381723]
quelle
Antworten:
Es gibt 2 8192 mögliche unterschiedliche 1K-Blöcke. Das Speichern würde 2 8202 Bit Speicherplatz beanspruchen . Da das Universum nur etwa 10 80 (oder ~ 2 266 ) Partikel enthält, können Sie mit Sicherheit nicht alle speichern, und Sie müssen sich nicht fragen, ob dies Zeit spart oder nicht.
Tatsächlich gibt es jedoch eine interessantere Möglichkeit, dies zu beantworten. Sie schlagen vor, einen Index für einen riesigen Konstantenpool zu erstellen. Aber woher wissen Sie, welcher Index dereferenziert? Stellen Sie sich vor im Interesse eines Arguments , dass Sie nur 1-Zeichenblöcke speichern wollen:
a
,b
,c
... Vermutlich Ihre Indizes wären 0, 1, 2 usw., denn das ist das effizienteste Layout dieser Blöcke zu speichern.Merken Sie etwas über das Arrangement? Ihr Index ist in der Tat eine verschlüsselte Darstellung der gespeicherten Daten ! Mit anderen Worten, Sie müssen überhaupt nicht dereferenzieren, sondern nur den Index in die gewünschten Daten umwandeln.
Wenn Sie alle möglichen Werte von etwas in einer Tabelle speichern , geschieht dies immer: Ihr Index wird lediglich zu einer verschlüsselten Version der Daten selbst, sodass das Speichern der Daten überhaupt nicht mehr erforderlich ist. Aus diesem Grund sind Indizes in der realen Welt nur für spärliche Daten nützlich (z. B. für alle von Ihnen besuchten Webseiten, nicht für alle Webseiten, die existieren könnten , oder sogar für alle, die existieren).
quelle
Wie bereits erwähnt, haben Sie 2 ^ 8192 Möglichkeiten für einen 1k-Block. Dies bedeutet, dass Sie 8192 Bits benötigen, um die Adresse eines Blocks zu codieren, wenn alle Blockadressen mit der gleichen Anzahl von Bits codiert sind, sodass Ihre Adressen 1 KB lang wären. Sie hätten nur eine Indirektionsebene hinzugefügt, um keine Leistung zu erzielen.
Wenn Sie kürzere Adressen haben wollten, müssten Sie einige Blöcke mit einer kurzen Adresse und einige mit längeren codieren und sie so gestalten, dass lange nicht so oft erscheinen, und Sie komprimieren jetzt einfach Daten (wahrscheinlich mit so etwas wie ein Huffman-Code ). Dies würde die Kenntnis der Daten erfordern, die Sie speichern, bevor Sie sie speichern, oder regelmäßige Änderungen der Codierung. Es wäre wahrscheinlich auch weniger effizient als andere Komprimierungsalgorithmen, die Blöcke unterschiedlicher Länge verwenden.
quelle
Damit sind zwei Probleme verbunden.
Erstens sind "alle möglichen binären Permutationen von einem Kilobyte" eine riesige Datenmenge. 1024 Bytes * 8 Bits pro Byte = 8192 Bits in einem Kilobyte. Alle möglichen Permutationen wären 2 ^ 8192. Das sind ungefähr
1.09e+2466
Kilobyte! (Zum Vergleich: Ein 1-TB-Laufwerk ist1e09
Kilobyte groß.)Zweitens, selbst wenn Sie eine so große Tabelle hätten und sie mit Zeigern indizieren würden, was würden Sie tun, wenn Sie auf Daten verweisen möchten, die kleiner als genau 1 KB sind?
quelle
Wie andere Plakate bereits erwähnt haben, hebt die Größe des Zeigers, der für die Indexierung aller möglichen Werte in Ihrer Liste erforderlich ist, Ihren Gewinn auf.
Einige Sprachen verwenden jedoch eine eingeschränkte Version Ihrer Vorschläge, um die Speichernutzung zu optimieren. Python verwendet String-Internierung, um die Anzahl der doppelten Strings im Speicher zu verringern. Weitere Informationen finden Sie, wenn Sie nach "Python String Intern" suchen.
quelle