Avatar billede doomstone-dk- Nybegynder
17. september 2004 - 00:14 Der er 7 kommentarer og
1 løsning

file_get_contents og en for stor fil

Jeg er ved at lave et script som loader en STOR xml fil ind i en sql database.
jeg bruge "file_get_contents" til at hente xml filen ind i en streng!
Men problemet er file_get_contents kan MAX læse 83mb filer og min fil er på 163mb! hvordan kan jeg gøre dette?

Kasper Rune Søgaard
Avatar billede swaxi Nybegynder
17. september 2004 - 00:41 #1
det lyder ret usundt at læse en 163mb stor fil ind i hukommelsen på een gang. du kan evt. læse den ind manuelt med fopen,fread,fclose. på den måde kan du også fodre xml_parse med en stump ad gangen og på den måde økonomisere lidt med hukommelsen.
altså noget a la :
[php]
$xml = xml_parser_create();
$fp = fopen("$filename", "rb");
while ($data = fread($fp, 4096)) {
    if (!xml_parse($xml, $data, feof($fp))) {
        trigger_error(sprintf("XML error: %s at line %d",
                    xml_error_string(xml_get_error_code($xml_parser)),
                    xml_get_current_line_number($xml_parser)), E_USER_ERROR);
    }
}
fclose($fp);
[/php]
Avatar billede doomstone-dk- Nybegynder
17. september 2004 - 01:36 #2
kender ikke lige de koder du bruger der!
og hvad er navnet på den skring hvor al dataen er i?
Avatar billede swaxi Nybegynder
17. september 2004 - 14:06 #3
> kender ikke lige de koder du bruger der!
http://www.php.net/manual/en/function.xml-parse.php

> og hvad er navnet på den skring hvor al dataen er i?
fremfor at læse hele tekstfilen op i hukommelse og derefter fodre det til en parser, læser jeg en stump af filen ad gangen og fodrer til parseren. dette bliver jeg ved med til filen er tom. på den måde slipper jeg for at have en midlertidige string på 163mb i hukommelsen.
Avatar billede doomstone-dk- Nybegynder
17. september 2004 - 19:41 #4
Jeg skal have selvet scriptet i en string eller kan jeg ikke bruge det!
Avatar billede swaxi Nybegynder
18. september 2004 - 14:48 #5
<?php
// get contents of a file into a string
$filename = "/usr/local/something.txt";
$handle = fopen ($filename, "r");
$contents = fread ($handle, filesize ($filename));
fclose ($handle);
?>
Avatar billede doomstone-dk- Nybegynder
19. september 2004 - 01:28 #6
Fatal error: Allowed memory size of 83886080 bytes exhausted (tried to allocate 167536140 bytes) in /var/www/html/tweakcalculator/loadxml.php on line 85
Avatar billede swaxi Nybegynder
19. september 2004 - 18:10 #7
ja så er dit problem at php forbruger mere hukommelse end den har lov til iflg. konfigurationen. du kan sætte værdien i php.ini :

memory_limit integer

This sets the maximum amount of memory in bytes that a script is allowed to allocate. This helps prevent poorly written scripts for eating up all available memory on a server. In order to use this directive you must have enabled it at compile time. So, your configure line would have included: --enable-memory-limit. Note that you have to set it to -1 if you don't want any limit for your memory.
Avatar billede doomstone-dk- Nybegynder
02. marts 2005 - 22:23 #8
lukker
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester