![]() |
1GB Pointer bekommen
Hallo einmal wieder,
Ich bin gerade an einem Programm amschreiben, wo ich große Datanmengen im Speicher ablege, damit ich die dan Verwalten kann. Der User kann den Buffer, die Größe an Daten, die im Speicher liegt fürs lesen selber Wählen. Ich wollte ihm natürlich auch eine Große Anzahl ermöglichen, da es eine Art FileViewer ist. Es ist eine 32bit Anwendung und ich hab kein Delphi XE2 oder so, um 64bit zu Kompilieren xD Und soll auch nicht. So ich habe selber 32bit Windows nur mit 4GB (3,5GB möglich zu verwenden, dass weiß ich) So bei Pointergrößen von < 256MB funkt es fast immer, wenn ich jedoch 512MB oder 1GB nehmen will, sagt er mir ich hätte nicht genug Speicher, was nicht Stimmt. So folgendes, gibt irgendeine Möglichkeit, einen Pointer zubekommen der solche Größen mir erlaubt oder nicht? Ich habe schon einen Post hier gelesen, das wegen Dll's und so es kaum Möglich ist so EINEN Pointer zubekommen der solche Größe hat. Kann ich dann vielleicht 4x256MB Pointer bei 1 GB machen? Weil das müsste ja gehen, da ich nen Spiel hab, das locker 1GB Speicher insgesammt verwendet, wenns läuft. Gruß NickelM |
AW: 1GB Pointer bekommen
Zitat:
Zitat:
Zitat:
Oder eifach deine Datenstrukturen so wählen das du einfach immer kleine Häppchen benötigst. Dann solltest du auch nahe der 2 bzw. 3 GB Grenze kommmen |
AW: 1GB Pointer bekommen
Was willst du eigentlich mit 1GB am Stück?
|
AW: 1GB Pointer bekommen
Naja, es ist einfacher mit einem Pointer, weil ich mit "Pointer-Adressverschiebung" arbeite um die Bytes im Pointer zu interpretieren aller
Delphi-Quellcode:
Wenn ich dann mit Offsets und mehrer Pointern (da ich dan die Pointer in nen Array hinterlege) und dann je nach Offset den Pointer wechseln muss, wird mist zuschreiben xD
PInt64(Cardinal(Anfangpointer) + Offset)^
Geht eigentlich nur um die Einfachheit und das ich nicht so oft direkt aus der Datei lesen muss. Ich glaube mit mehren Pointern bei 1GB zuarbeiten wird etwa umständlich. besonders, wenn der Bereich von einem Typ (Int64 z.b.) in einen anderen Pointer übergeht, dann muss ich das zwischenspeichern und lesen, das ist Mist. |
AW: 1GB Pointer bekommen
Klingt nach einem Kandidaten für Memory Mapped Files.
Für MMF gibt es auch schon einige Wrapper hier in der DP, z.B. (auf die Schnelle über Google gefunden) ![]() |
AW: 1GB Pointer bekommen
Zitat:
Wenn Du in einer Datei einen String der Länge L suchst, dann liest Du dir einen Puffer der Länge P ein, wobei P>L. Du kannst direkt bis von Position 0..P-L suchen. Dann verschiebst Du die Bytes P-L...P-L-1 an die Stelle 0..L-1 und liest P-L-1 Bytes ab Position L ein. Das ganze wiederholst Du bis zum Ende. Fertig. Das geht natürlich noch schneller und vielleicht sogar mit MMF, aber eine nette Übung ist es in jedem Fall. Merke: Mach es richtig UND einfach, nicht einfach nur einfach. |
AW: 1GB Pointer bekommen
Naja, im Prinzip mache ich ja sowas ähnliches. Ich teile eine Datei in Buffers auf und lese den kompletten Buffer und danach interpretiere ich diesen Buffer. Ich kann dann, wenn die Datie größer ist als der Buffer, den rest oder den nächsten Teil der Datei in den buffer lesen und interpetieren. Es ist mit absicht so gemacht, dass man nur den Buffer interpetiert wird.
Naja ich kann ja mal kurz das Prog erklären, weil ich es sowieso später in die DP setzen wollte. Das Programm ist dafür da, die Bytes einer Datei zu interpretieren und dadurch Formate zu verstehen und dann Programme zuschreiben, die das Format lesen. Es ist eine Art Tool für Programmierer, die Formate lesen wollen, wo es z.b. keine Docu gibt. Es soll nicht zum Hacken oder sowas animieren xD Mann kann dann halt die Bytes interpretieren lassen und dafür wäre es am besten einen Pointer für die Daten, die interpetiert werden, zuhaben. Das macht es am einfachsten. Ich denke aber, das ich wohl den auszuwählen Buffer wohl auf 256 MB begrenzen muss, weil die größen halt selten verwendet werden können. |
AW: 1GB Pointer bekommen
Du kannst auch eine MMF nehmen, welche sogar mehr als 4GB vom physischen RAM+Auslagerungsdatei nutzen könnte
und davon wird dann immer nur der grade benötigte Teil in deinen virtuellen Arbeitsspeicher (standardmäßig 2 GB) mappen. |
AW: 1GB Pointer bekommen
[OT]
Cool, sowas hatte ich mir schon öfter gewünscht... also so eine Art „Syntaxhighlighting“ für Binärdateien... oder man könnte auch sagen IDA Pro für reine Daten statt für Programme. Hatte aber nie die Idee, wie man das gescheit umsetzen könnte aufgrund der unendlichen Möglichkeiten, wie ein Format aufgebaut sein könnte. Solange es sich nur um einfache Record-Formate handelt, ist es ja noch einfach, aber was, wenn die Datei aus mehreren Abschnitten oder aus Chunks mit Längenangabe besteht, oder es sich gar um eine Baumstruktur handelt oder oder oder... Ist eigentlich nur mit Scripting zu realisieren, meine ich. Da besteht die Kunst dann darin, eine gute API zu designen. Würde mich sehr interessieren, was du am Ende zu stande bringst :) [/OT] |
AW: 1GB Pointer bekommen
Deine Zeigerarithmetik ist falsch. Stichwort PByte ab XE2 bzw. PAnsiChar bei <XE2.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz