Perl és seek

hello

adott egy kis rendszer már mint erőforrásilag és néhány nagy állományt kell feldolgozni Perl-el.
Arra nincs elég hely, hogy egyben felparsoljam az összest fájlt szóval soronként kéne feldolgozni majd a feldolgozott sorokat kiküldeni egy hállózati csatolóra.

Na a gondom az h hogyan tudok soronkét feldolgozni?

Pl.
van 3x 2G fájl. Nincs elég RAM és SWAP h fel'szürcsöljem' (hamár Perl zsargont - slurp, akarok használni). Összekell őket fésülnöm egy rendezett táblába azaz meg kell nyitnom mind a 3 fájlt egyszerre, majd 1. sor az első fájlból, 1. sor másodikból és az 1. sor a harmadikból.
Szóval valmai ilyesmi kell de ez nem hiszem h jó:

open (FILE1, $file1) or die "The $file1 can't be openned: $!\n";
open (FILE2, $file2) or die "The $file2 can't be openned: $!\n";
open (FILE3, $file3) or die "The $file3 can't be openned: $!\n";
open (MERGE, ">merge.txt") or die "The merge.txt can't be openned: $!\n";

my $line1 = < FILE1 >;
my $line2 = < FILE2 >;
my $line2 = < FILE3 >;
# a helyes format nem jeleníti meg a HUP :(
my $counter = 0;
while (defined($line1) || defined($line2)|| defined($line3)) {
if (defined($line1)) {
print MERGE $counter,"\t",$line1;
$line1 = ;
}
if (defined($line2)) {
print MERGE $counter,"\t",$line2;
$line2 = ;
}

if (defined($line3)) {
print MERGE $counter,"\t",$line3;
$line2 = ;
}
$counter++;
}

mivel itt mind a 3 fájlt egyszerre betöltené a memóriába és az megfektetné a rendszert.

Az hiszem a seek az én barátom de nem értem hogyan tudnám használni.
http://perldoc.perl.org/functions/seek.html
seek(TEST,0,1);

Amint látszik nem vagyok programozó - de dolgozom a fejlődésemen :)

Hozzászólások

Lehet, és ha rákeresel arra, hogyan lehet sorról sorra olvasni, meg is tudod csinálni (seekre nincs szükség), de azért olvasd el ezt is, hátha nem is kell több: man paste

ez soronkent olvas...


open (FILE1, $file1) or die "Can't open file: $!\n";
while(my $line=<FILE1>){
  akarmi...
}

amivel kevered es egyben olvasna be egy tombbe az pedig a


@lines = <FILE1>;

csatlakozom kivaldi hozzászólásához, szerintem a te kódod sem fogja berántani a memóriába a teljes fájlokat,

nem tudom, hogy milyen környezetben, milyen Perl verziót használsz, de egy Windows-os portable Strawberry-n ki is próbáltam, és kb. 400 MB-tal nőtt meg a memóriafoglalás a futáskor... (ebben értelemszerűen a Perl bináris memóriafoglalása is benne volt)

Nem kell seek a feladat megoldásához. Az, amit néztél, teljesen jó amúgy, nem fogja megenni a memóriát. Kicsit lehet a struktúrán simogatni:

open(IN1,...
open(IN2,...
open(IN3,...
open(MERGE,...
my $counter = 0;
while (1) {
my $line1 = <IN1>;
my $line2 = <IN2>;
my $line3 = <IN3>;
last unless defined $line1 || defined $line2 || defined $line3;
print MERGE $counter."\t".$line1 if defined $line1;
print MERGE $counter."\t".$line2 if defined $line2;
print MERGE $counter."\t".$line3 if defined $line3;
$counter++;
}
close(MERGE);
close(IN1);
close(IN2);
close(IN3);

Az allomanyaidban csak a sorokat kell rendezned? Tehat a file1line1, file2line1, file3line1? Nem A file2line2 nem kerulhet a file3line1 ele?

A kódod összesen egyetlen sort olvas be a 3 fájl elejéről, úgyhogy minimum egy ciklus. (És ahogy már szerepelt: mivel skalárba olvasod be a fájlt, ezért ott csak egyetlen sort kapsz. Akkor olvasnád be az egész fájlt, ha nem skalár, hanem listakörnyezetben olvasnál, azaz nem
$a=< akarmi >
hanem
@a=< akarmi >
szerepelne.)

Pusztán attól, hogy soronként olvasol három fájlt, nem kerül a teljes fájltartalom memóriába. Hogy az illető sorokkal mit kell csinálni, az a feladattól függ.