Schrift
[thread]6459[/thread]

Arbeitsspeicherüberlauf



<< >> 8 Einträge, 1 Seite
rookie
 2004-08-04 11:37
#85364 #85364
User since
2004-07-28
9 Artikel
BenutzerIn
[default_avatar]
Hallo,

wie geht man mit Dateien um die man komplett einlesen muss, die aber größer als der vorhandene Arbeitspeicher sind? Behandelt man sie päckchenweise? Ich möchte eine Speicherauslagerung vermeiden da die mich Zeit kostet.

Danke=)
Ronnie
 2004-08-04 11:47
#85365 #85365
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Du kannst Tie::File verwenden, wenn du die Datei zeilenweise durchgehen musst. Das ist soweit ich mich erinnere unproblematischer weil immer nur ein Block in den Arbeitsspeicher gelesen werden muss.
rookie
 2004-08-04 12:05
#85366 #85366
User since
2004-07-28
9 Artikel
BenutzerIn
[default_avatar]
die datei ist aber ein binär file und ich adressiere byteweise da meine informationen in einem 16 byte format stecken - jede 16 byte lese ich in ein element eines feldes ein -- da ich alle informationen bearbeiten muss kann ich nicht immer einmal 16 byte nehmen bearbeiten und das nächste - kostet zuviel zeit da jedesmal ein dateizugriff stattfindet??!
Crian
 2004-08-04 13:35
#85367 #85367
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Dann lies doch in Blöcken mit einem Vielfachen von 16 Byte und splitte diese dann selbst auf. Aber eigentlich würde ich erwarten, dass das System diese Arbeit für mich macht.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
ptk
 2004-08-04 14:49
#85368 #85368
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
[quote=rookie,04.08.2004, 10:05]kostet zuviel zeit da jedesmal ein dateizugriff stattfindet??![/quote]
Das unterliegende System (stdio oder PerlIO) liest immer groessere Bloecke ein, so dass kein Festplattenzugriff dabei stattfindet.
Gast Gast
 2004-08-06 16:31
#85369 #85369
d.h. es werden automatisch Blöcke abhängig vom aktuellen Arbeitsspeicher eingelesen - auch wenn ich anweise das die komplette Datei in ein Array eingelesen werden soll?

Danke im Voraus
Ishka
 2004-08-06 16:53
#85370 #85370
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Es werden immer Blöcke der Größe, die von deinem Dateisystem her optimal ist, eingelesen und im Arbeitsspeicher behalten. Sobald du mehr Daten von der Datei haben willst, wird der nächste Block eingelesen. (es sei denn du arbeitest mit syswrite und sysread)
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
murphy
 2004-08-06 17:06
#85371 #85371
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Wenn man aber die ganze Datei komplett in eine Datenstruktur einliest, dann liegt diese Datenstruktur auch komplett im Speicher bzw. Swap!
Das Puffern dient nur dazu, dass auch ein Algorithmus, der eine Datei z.B. zeichenweise bearbeitet, noch effizient laufen kann, ohne dass sich der Programmierer einen Kopf machen muss, in welchen Portionen er die Datei am besten einliest -- eben genau was du brauchst ;)
When C++ is your hammer, every problem looks like your thumb.
<< >> 8 Einträge, 1 Seite



View all threads created 2004-08-04 11:37.