Schrift
[thread]7724[/thread]

performanter dateizugriff



<< |< 1 2 3 >| >> 23 Einträge, 3 Seiten
Froschpopo
 2006-02-21 20:17
#63136 #63136
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Ich arbeite mit mod_perl und datenbanken.
nun möchte ich noch einige binäre dateien verarbeiten die ich ungern in der datenbank speichern möchte, da sie noch von einigen anderen programmen genutzt werden.
Jetzt habe ich ein wunderbar schnelles mod_perl2-Script, welches jedoch jedesmal durch den Zugriff auf die Textdatei ausbremst.
Gibts irgendwie ne möglichkeit diese textdatei auch in mod_perl2 einzubinden, dass sich diese datei quasi im Arbeitsspeicher aufhält?

Wenn ich Linux benutze, müsste ich die Textdatei doch theoretisch in ein temporäres Verzeichnis packen können, oder?
Wenn das möglich ist, was für schritte sind dann notwendig, damit perl erkennt, dass sich diese textdatei in einem temp befindet?
esskar
 2006-02-21 20:55
#63137 #63137
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
hast du nur lesenden oder auch schreibenden ZUgriff auf die Datei?
Wie groß ist sie?
Froschpopo
 2006-02-21 21:23
#63138 #63138
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
durchschnittlich ca 5 bis 10 kb! schreiben und lesen
Neal_the_real
 2006-02-21 21:24
#63139 #63139
User since
2006-02-21
21 Artikel
BenutzerIn
[Homepage] [default_avatar]
Also ich wuerde es so machen:
Die Daten erst mal in eine Variable (dann sind sie auf jeden Fall im RAM und werden auch dort gehalten) packen.

Du schreibst das auch andere Programme die Daten verarbeiten koennen. Deswegen wuerde ich bevor die auf $data zugreifst einen stat auf die file.dat machen.
perldoc -f stat perlfunc
Dort bekommst du die mtime der Datei raus (also wann die Datei das letzte mal veraendert worden ist).

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
my $mtime;
my $line;
my $data;

#auf $data kann man getrost zugreifen mtime hat sich nicht geaendert
if(($mtime == (stat("file.dat"))[9]) && (defined($mtime))) {
#.... Verarbeitung von $data

#erstes mal einlesen oder mtime hat sich geaendert
} else {
$data = '';
open(FILE, "< file.dat");
while($line = <FILE>) {
$data .= $line;
}
close(FILE);

$mtime = (stat("file.dat"))[9];
}
--
Gruss Neal

Hier koennte ein schlauer Spruch stehen!
ptk
 2006-02-21 22:39
#63140 #63140
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Wenn du ein richtiges Betriebssystem hat, dann werden häufig zugegriffene Dateien automatisch im RAM gecachet. Wahrscheinlich bei Linux besser als bei Windows, und bei *BSD besser als bei Linux, behaupte ich einfach so ohne Beweise zu liefern.

Die effizienteste Methode, mit mod_perl eine Datei auszuliefern, ist send_fd().
Neal_the_real
 2006-02-22 09:33
#63141 #63141
User since
2006-02-21
21 Artikel
BenutzerIn
[Homepage] [default_avatar]
Wenn du eine Datei einlesen willst wird sie immer von Platte gelesen. Egal welches Betriebssystem du hast.

Was richtig ist das eine Datei, wenn du sie bearbeitest, nicht gleich auf die Platte geschrieben wird, sondern die Daten noch im Puffer (RAM) liegen.

Deswegen muss man z.B. auch eine Diskette oder einen USB Stick unmounten bevor man ihn aus dem System nimmt. Sonst gehen Daten verloren.

Aber wenn du eine Datei aus einam Script oeffnest wird immer ein Systemcall open() und dann ein bis mehrere read() ausgefuehrt.
--
Gruss Neal

Hier koennte ein schlauer Spruch stehen!
nepos
 2006-02-22 11:04
#63142 #63142
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Nein Neal, es gibt auch einen Lese-Cache. Linux verwendet zum Beispiel einen Grossteil des freien Hauptspeichers fuer Caches. Wenn du die gleiche Datei x-mal hintereinander liest, wird sie nur beim ersten mal wirklich von der Platte gelesen, danach kommt sie aus dem Cache im Speicher, der natuerlich wesentlich flotter ist.
Da macht auch der System-Call open und Co keinen Unterschied, denn das Caching im OS liegt dahinter.
bloonix
 2006-02-22 11:59
#63143 #63143
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=nepos,22.02.2006, 10:04]Nein Neal, es gibt auch einen Lese-Cache. Linux verwendet zum Beispiel einen Grossteil des freien Hauptspeichers fuer Caches.[/quote]
nicht ganz ... ein Linuxsystem verwendet den restlichen zur
Verfügung stehenden Hauptspeicher als Buffer Cache. Da der
Benutzerspeicher eine höhere Priorität hat, wird der Buffer
Cache zugunsten des Benutzerspeichers verkleinert.

Quote
Linux is renowned for its fast disk access and this is mainly because of its efficient implementation of the buffer cache. The buffer cache rose and shrinks dynamically in user memory as required. (Actually, kernel memory grows dynamically into user memory to allow this - the buffer cache is still considered part of kernel memory.)


Auch hier nachzulesen: Linux Internals

@froschpopo, vielleicht könnte das Sticky Bit für dich
interessant sein, für Dateien, die von mehreren Benutzern
bzw. Skripts genutzt werden sollen und der Zugriff sehr
performant sein soll... aber vorsicht, ich habe mal gelesen,
dass es hierbei ein paar Dinge zu beachten gibt...

greez,
opi

Edit:
Code: (dl )
1
2
lxzpr013:/etc # ls -l / | grep tmp
drwxrwxrwt    9 root     root         4096 Feb 22 12:30 tmp
\n\n

<!--EDIT|opi|1140608032-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
nepos
 2006-02-22 13:44
#63144 #63144
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
@opi: jo, das hatte ich wohl noch unterschlagen ;)
Neal_the_real
 2006-02-22 14:35
#63145 #63145
User since
2006-02-21
21 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=nepos,22.02.2006, 10:04]Nein Neal, es gibt auch einen Lese-Cache. Linux verwendet zum Beispiel einen Grossteil des freien Hauptspeichers fuer Caches. Wenn du die gleiche Datei x-mal hintereinander liest, wird sie nur beim ersten mal wirklich von der Platte gelesen, danach kommt sie aus dem Cache im Speicher, der natuerlich wesentlich flotter ist.
Da macht auch der System-Call open und Co keinen Unterschied, denn das Caching im OS liegt dahinter.[/quote]

Ja ok, du hast recht. Aber ich denke das das Betriebssystem in der Zwischenzeit viele andere Sachen in den Speicherladen muss. Kommt halt ganz auf die groesse des Ram's an.

Aber das kann man ja nicht beeinflussen ob die Daten noch im Lesepuffer sind oder nicht. Wenn man die Daten in eine Programmeigenen Datenstruktur ablegt, dann ist man auf jeden Fall auf der sicheren Seite. Das wollte ich damit ausdruecken.

Ich habe z.B. einen V Server der mir meine Partition per NFS bereitstellt. Wenn ich da auf Daten zugreifen will dauert das ewig.
--
Gruss Neal

Hier koennte ein schlauer Spruch stehen!
<< |< 1 2 3 >| >> 23 Einträge, 3 Seiten



View all threads created 2006-02-21 20:17.