Archiv verlassen und diese Seite im Standarddesign anzeigen : Speicher-Nachschlag
hallo
ich habe das Problem immense daten temporär verwalten zu müssen.
größenordnung :
ca. array [1..29000] [1...1024]
dazu reichen natürlich die paar gegebenen kB nicht aus.
Wie kann ich mehr Speicher für dieses Monster-Array
abzapfen ?
neffe
Felix Kaiser
31.01.2002, 15:44
Protected Mode sollte helfen, aber das Teil ist über 28Mb groß und solche Arrays sind eigentlich nur das Produkt einer nicht zuende gedachten Problemlösung ...
mag sein ... dennoch brauch ich mehr Speicher ... wie wende ich diesen protected mode genau an ?
nur zur info : es geht um einen Zeilencamera(1024bit)
die um die 29000 messungen pro sekunde hinbekommen soll.
Felix Kaiser
31.01.2002, 20:43
Protected Mode unter DOS funktioniert nur mit Borland Pascal 7.0. Übrigens, wenn du wirklich 1024 Bit meinst, kannst du die sehr gut komprimieren ... nämlich auf 128 Byte. Bei 29000 Arrayindizes macht das exakt 3625 KByte. Eine für den Protectedmode gut machbare Größe. Wenn du allerdings kein Borland Pascal haben solltest, dann hast du ein Problem ...
Zu dem würde mich mal interessieren, wie du exakt 29000 Messungen / Sekunde durchführen willst. Möglichkeiten gibt es genug, jedoch würde ich an dieser Stelle dringenst eine Assembleroptimierung der Hardwaregreifenden Routinen empfehlen!
die mitgelieferten prozeduren sind schon in assembler
...die auslese-routine leifert als ergebnis ein 1024 stellen langes array .... ich lasse diese prozedur einfach in einer nach einer sekunde abbrechenden schleife laufen. dann hab ich nach jedem
durchlauf 1024 werte. mir würde es auch reichen wenn
ich die werte auf so ne art imaginärem(nicht sichbaren) bildschirm (so ne art screen-image) in echtzeit ausgeben und nach dem auslese-vorgang wieder einlesen könnte.
neffe
Felix Kaiser
31.01.2002, 23:13
also 1024 werte = 1024 bytes, nicht bits, in einer sekunde soviele werte wie möglich ist natürlich scheiße, weil bei nem schnellen cpu kommste da schnell über die dimensionen des arbeitsspeichers hinaus, zumal du unter dos eh nur 64MB verwenden kannst. ich könnte dir die möglichkeit anbieten über CMOS RTC IRQ 8 das ganze laufen zu lassen, bekommst exakt 1024 messungen in der sekunde. diese lassen sich erstens gut speichern in 1MB RAM und hinterher gut auswerten. sollten dies zuwenige sein könnte man den PIT0 umtakten (Programmable Interrupt Timer 0 / IRQ0), von ~ 18.2 Hz z.B. auf 15kHz (15000 messwerte/sekunde). allerdings funktioniert dies nur unter reinem DOS (oder DOS Modus von Windows9x) und es würde deine Systemzeit zerstören, da die CMOS Echtzeituhr über diesen Systemtimer gesteuert wird und wenn dieser von 18.2 Hz auf 15kHz beschleunigt würde ...
Und ich weiß immernoch nicht ob du überhaupt ein Protected Mode fähiges Pascal hast .... !
ich hab pascal 7.0 ..... bloß sagen mir die von dor angesprochenen modi bzw verfahren nicht sehr viel ... könntest du mir mal n beispielprogramm oder sow as per mail schicken, oder mir nen link schicken ?
danke
n.
Diogenes
01.02.2002, 14:06
Die 7er-Pascal von Borland (TP und BPW) sind Protected-Mode-fähig. Man muß dazu die Compiler-Optionen verstellen. Der interne Debugger geht dann nicht mehr, sondern es wird der Turbo-Debugger gestartet.
Das array wird sich unter keinen Umständen direkt definieren lassen: Der Compiler verweigert die Definitionen von Strukturen, die größer als 64kB sind - kommt von 16-Bit-Adressierung.
Was Du, neffe, allerdings machen kannst, ist ein Pointer-Array zu definieren und diese Pointer auf hinreichnd große Strukturen zeigen zu lassen. Das würde alles auf dem Heap stehen. Etwa so:
type
PBasisAry=^TBasisAry;
POddAry = ^TOddAry;
PBits=^TBits;
TBasisAry=array[ 1 .. 14500] of POddAry; {ist 58000 byte groß}
TOddAry=array[False..True] of PBits; {Ist 8 Byte groß}
TBits=array[0 .. 127] of Byte; {Komprimierte 1024 bits}
Den Rest und die Ansprache kannst Du Dir vielleicht schon denken:
Suche der Zeile;
ptZeile {ist var vom Typ PBits} := BasisAry^[ ZeilenNo div 2]^[ Odd( ZeilenNo)];
Das einzelne Bit spricht man an mit
ByteIndex := X div 8;
ptZeile^[ ByteIndex] {referenziert das Byte, in dem das Bit mit}
BitWert := 1 shl (X mod 8); {angesprochen wird}
Das alles muß natürlich beim Start eingerichtet (New) und initialisiert werden. Vergiß nicht, daß Du das beim Ende auch wieder aus dem Speicher schmeißen mußt (Dispose). Das sind immerhin fast 4MB - die würden Dir noch fehlen!
Eine zweite Möglichkeit ist, mit das Basisarray mit einer Kollektion (einem TCollection-Abkömmling - OOP!) zu verwalten und seine Items wären dann 256 Byte große array, in denen gerade/ungerade und die Zeile zusammen gefaßt wird.
Alle Klarheiten beseitigt?
hey ..danke ... du machst dir ja richtig Mühe.
Also mit Zeigern kenn ich mich in etwa aus ... es ging mir mehr darum wie ich diesen protected mode nun genau initialisiere (hab tp7.0 noch nicht installiert) ... läuft das über ein menü oder wird es bei der programminitialisierung mit angegeben ?
neffe
Felix Kaiser
01.02.2002, 20:28
Im 7er Pascal kümmert dich die Initialisierung nichts, gibt im Menü einfach eine Option, mit der man die Platform wählt, ob Realmode, Protected Mode oder 16-Bit Windows Anwendung.
Im Protected Mode hast du dann anstatt des 640Kb DOS Speichers den gesamten Arbeitsspeicher als Heap zur Verfügung, mit dem du je nach installiertem RAM über GetMem, FreeMem, etc. problemlos bis zu 64MByte Arbeitsspeicher anzapfen kannst.
na das hört ja gut an ... vielen dank Guru und Diogenes für die zahlreichen Hinweise .... werde mich demnächst mal wieder ransetzen .... wenns weitere probleme gibt melde ich mich zurück.
Neffe
Felix Kaiser
01.02.2002, 22:29
Nun verrate mir mal noch plz über welche Timingmethode du nun messen willst :]
ich werde erst mal das fundament legen .... es ist sowieso noch nicht klar ob die camera mit voller geschwindigkeit genutzt wird oder ob ich noch meßintervalle einbaue (was mir natürlich lieber wär).
neffe
Felix Kaiser
02.02.2002, 01:24
was leistet die kamera denn?
jedenfalls, wenn dann der timing teil kommt, meldest dich bei mir ;)
Guru:
"Im Protected Mode hast du dann anstatt des 640Kb DOS Speichers den gesamten Arbeitsspeicher als Heap zur Verfügung, mit dem du je nach installiertem RAM über GetMem, FreeMem, etc. problemlos bis zu 64MByte Arbeitsspeicher anzapfen kannst."
"je nach installiertem ram" = physisch eingebauter Speicher oder in config.sys evtl. durch xms bereitgestellter speicher ?
bei :
Type
ZArray = Array[1 .. 1200] of Byte;
BArray = Array[1 .. 10000] of ZArray; <--- too large
Var
Zeile : ^ZArray;
Messung : ^BArray;
..hat er zuwenig speicher obwohl dieses Konstrukt die 64 MB grenze wohl nicht überschreiten dürfte.
maxavail liefert 67223696.
hab grad gemerkt, dass ich ja im protected mode in WIN 98 arbeite, wo der xms ja keine bedeutung haben dürfte.
Felix Kaiser
07.03.2002, 15:48
Logisch, in der DOS Box wird der RAM über den KERNEL32 von Windows abgezapft. Du vergisst aber eine Tatsache: Ein Array darf trotzdem nicht größer als 64K sein.
Type
ZArray = Array[1 .. 1200] of Byte;
BArray = Array[1 .. 10000] of ^ZArray;
Var
Zeile : ^ZArray;
Messung : ^BArray;
Löse es so, dass jede Zeile als Zeiger in BArray drin steht. Ich hoffe nur, dass somit nicht zuviele Speicherhandles vergeben werden. Sollte aber in der DOS Box kein Problem darstellen, versuchs halt mal.
yup yup ...
Type
ZArray = Array[1 .. 1024] of Byte;
BArray = Array[1 .. 1700] of ^ZArray;
Var
Zeile : ^ZArray;
Messung : ^BArray;
nimmt er .... thx
neffe
ich mein natürlich [1..16000] of ^ZArray
...aber egal ...wozu ich den orotected mode brauch versteh ich nicht so richtig ... da dieses protected-mode-programm (BPW) als .exe NICHT im Dos-Modus lief ....
dasselbe konstrukt im reinen BP-Dos Modus funktionierte jedoch. Häh ? :mauer:
neffe
Felix Kaiser
07.03.2002, 18:08
BPW ist Borland Pascal for Windows, wenn du damit compilierst entstehen stets 16-Bit Windows Anwendungen. Windowsanwendungen heißt immer Protected Mode. Und mit dem Borland Pascal Compiler (BPC) kannst du DOS Programme compilieren, entweder Real Mode oder Protected Mode. Beide gehen sowohl in der DOS Box als auch unter echtem DOS. Also normale DOS Anwendung im Parameter Protected Mode compilieren ;)
ich habe gelesen, dass der protected mode die erstellung von DOS-programmen unter anderen OS ermöglicht.
wenn ich auch im DOS-bp ein protected-mode programm erzeugen kann, wie denn ? ich hab den menüpunkt dort nicht gefunden. und welche vorteile bietet mir das (mehr speicher zur verfügung?).wie du siehst gehen mir die fragen so schnell nicht aus. :)
neffe
Felix Kaiser
07.03.2002, 20:29
Verdammt :D
Also unter Borland Pascal 7: Im Menü Compile, Target -> Protected mode Application. Siehste dann schon.
Der wesentliche Vorteil des Protected ist die von Grund auf andere Speicherverwaltung im System. Speicher und Interrupt werden vom CPU im Protected Mode besser und vorallem flexibler verwaltet. Wie genau erklär ich jetzt nicht, ist zu fachspezifisch auf CPU Architektur bezogen. Du musst nur wissen: Du kannst bis zu 64MB Arbeitsspeicher verwenden mit Borland Pascal im Protected Mode. Im groben und ganzen läuft der Rest auch wie im normalen Real Mode.
tja compile-target gibts aber nur im bpw !
im dos-bp is da kein TARGET !!!! X(
*verzweifel*
und ich hab Version 7.0 !
neffe
Felix Kaiser
07.03.2002, 21:22
Hmm? Hast doch Borland Pascal 7? Dann hast doch ne BP.EXE und dort in dem Menü, eigentlich, hmm ... Haste sowas halt in der Windows Oberfläche?
8o
jetzt sag ich GAR nichts mehr ...... hab immer turbo.exe gestartet ....bei bp.exe kam dann auch promt compile-target ..... war wohl so ne alte Angewohnheit die turbo.exe einzutippen. :mauer:
mir reichts jetzt ... brauch ne Pause .... erst mal entspannen ... mit Data Warehouse Technologien ;(
vielen dank für deine Geduld .... bin bald wieder da um sie zu strapazieren ....
neffe
Diogenes
07.03.2002, 23:01
So! Das war ja 1 heiße Diskussion. Wenn man erst um 2300 dazukommt... :(
Man kann ja seinen Job nicht mehr machen... :D Jedefalls danke, Guru, fürs Übernehmen.
vBulletin® v3.8.6, Copyright ©2000-2012, Jelsoft Enterprises Ltd.