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 :)
- 1767 megtekintés
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
- A hozzászóláshoz be kell jelentkezni
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>;
- A hozzászóláshoz be kell jelentkezni
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)
- A hozzászóláshoz be kell jelentkezni
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);
- A hozzászóláshoz be kell jelentkezni
Az allomanyaidban csak a sorokat kell rendezned? Tehat a file1line1, file2line1, file3line1? Nem A file2line2 nem kerulhet a file3line1 ele?
- A hozzászóláshoz be kell jelentkezni
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.)
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni