![]() |
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.
|
AW: 1GB Pointer bekommen
[OT]
Jap :-D Geht mir genauso. Bin noch einige Sachen am Einbauen, wie Ansi- und WideStrings will auch noch abhängigkeiten von anderen "Variablen" einbauen. Bin noch am überlegen, wie ich das mache, werde es aber im Projektbereich hochladen. [/OT] Deshalb schreib ich das gerade, hab grad was andere getestet und funkt sogar noch besser. Warum umständlich, wenns auch einfacher geht :-D Also hat sich die Frage erledigt. @Insider2004: Danke für die Info, weiß ich aber, wegen Ansi-und WideString usw. :) |
AW: 1GB Pointer bekommen
Ich rede hier nicht von Strings, sondern von Zeigerarithmetik. Suche Dir mal ein paar Beispiele für Pointer-Math in Google.
|
AW: 1GB Pointer bekommen
Zitat:
Allerdings ist die Technik in Netzwerkscanner wie z.B. Wireshark oder Microsoft Network Monitor eingebaut. Den Microsoft Network Monitor hat z.B. eine eigene Sprache "Network Monitor Parsing Language" mit der man eigene Protokolle und Datenstrukturen beschreiben kann. Also wenn man soetwas je selber bauen möchte: dort kann man was abschauen. |
AW: 1GB Pointer bekommen
Stimmt, jetzt wo du es sagst, Wireshark hatte sowas. Aber das dort war nicht interaktiv. Interessant wäre es ja gerade, um unbekannte Dateiformate zu analysieren. Das Microsoft-Tool kenne ich noch nicht...
Aber genug Off-Topic. |
AW: 1GB Pointer bekommen
Zitat:
Ich habe so etwas selbst mal umgesetzt, aber aus Zeitgründen nie als fertiges Projekt zusammenstellen können. Das gibt es aber schon in diversen Editoren. Z.B. im 010 Editor oder im Hex Workshop: ![]() ![]() Oder auch kostenlos in diesem sehr interessanten Tool, das auch noch mit Quelltext zur Verfügung steht: ![]() |
AW: 1GB Pointer bekommen
Zitat:
Wenn er einen Int64 auslesen will, ist PInt64()^ doch vollkommen ok, oder habe ich dich da falsch verstanden? |
AW: 1GB Pointer bekommen
Ich glaub, ich hab da noch ein Cardinal mit drinnen gesehn.
|
AW: 1GB Pointer bekommen
Zitat:
|
AW: 1GB Pointer bekommen
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:07 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-2025 by Thomas Breitkreuz