Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]11799[/thread]

Dummy file mit bestimmter Größe erzeugen?



<< >> 7 Einträge, 1 Seite
JackBauer
 2008-05-14 11:44
#109674 #109674
User since
2008-04-30
16 Artikel
BenutzerIn
[default_avatar]
Hallo zusammen!

Hat jemand von euch eine Idee, wie ich in Perl eine temporäre Datei mit einer bestimmten Größe in kb erzeugen kann?

Wäre ich nicht in einer Windowsumgebung, würde ich das mit dem Unix-Befehl dd lösen.

Eigentlich müßte man das doch hinkriegen, indem man entsprechend viele Charakters in einer Schleife in die Ausgabedatei schreibt...

Edit: Laut Kommandozeile belegt ein einzelnes Zeichen in Perl ein Byte. Ich versuche mich einfach mal ein wenig :)

Gruß JackBauer
moritz
 2008-05-14 11:56
#109676 #109676
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
Wenn die Größe noch bequem in den Arbeitsspeicher passt brauchst du gar keine Schleife:

Code: (dl )
1
2
my $count = 20;
print 'a' x $count;
JackBauer
 2008-05-14 12:01
#109681 #109681
User since
2008-04-30
16 Artikel
BenutzerIn
[default_avatar]
Fertig :) Habe es jetzt so gelöst:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
my $size = 300;
my $counter = $size * 1024;
open(file, ">".$size."kb.txt");
        
for(my $i=0; $i < $counter; $i++)
{
        print file "*"; 
}       
close(file);


@moritz

Ich brauche die Datei schon in echt, da ich sie anschließend via FTP uploaden möchte.
Taulmarill
 2008-05-14 12:13
#109682 #109682
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
Was moritz meinte war, dass man größere Teile direkt im Arbeitsspeicher erzeugen kann und dann in einem Schwung in die Datei schreibt. Das verringert die Anzahl der Schleifendurchläufe. So hätte ich das z.B. gelöst:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
use strict;
use warnings;

my $size = 300;
open my $file, ">", $size . "kb.txt" or die $!;

print $file "*" x 1024 for 1 .. $size;

close $file;

Das ganze ist dann auch gleich um den Faktor 10 schneller als dein Beispiel.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
JackBauer
 2008-05-14 12:16
#109683 #109683
User since
2008-04-30
16 Artikel
BenutzerIn
[default_avatar]
@Taulmarill

Naja, bei kleinen Dateigrößen macht sich das sicher nicht wirklich bemerkbar, aber trotzdem danke. Habe den Code entsprechend geändert.
KurtZ
 2008-05-14 14:30
#109687 #109687
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
JackBauer+2008-05-14 10:16:21--
Naja, bei kleinen Dateigrößen macht sich das sicher nicht wirklich bemerkbar...


Faktor 1024? Selbst wenn der plattenzugriff erst gecachet wird sollte sich das bemerkbar machen...
TMTOWTDYOG (there's more than one way to dig your own grave)
Dubu
 2008-05-15 02:06
#109719 #109719
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Man muss nicht wirklich so viel auf Platte schreiben - wenn es nicht auf den Inhalt ankommt:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
#!/usr/bin/perl
use strict;
use warnings;

my $size = 1_000_000;

open my $bigfile, '>', 'bigfile' or die $!;
seek $bigfile, $size-1, 0;
print $bigfile "\0";
close $bigfile;


Wichtig ist nur, dass man am Ende auch etwas hineinschreibt, sonst bleibt die Datei bei 0 Bytes. :)
<< >> 7 Einträge, 1 Seite



View all threads created 2008-05-14 11:44.