2013-02-13 20 views
7

की सामग्री को पढ़ें और पार्स करें मैं एक टैब सीमांकित फ़ाइल को पार्स करने का प्रयास कर रहा हूं जो आकार में ~ 1 जीबी है।बहुत बड़ी फ़ाइल

मैं स्क्रिप्ट कहाँ चलाने मैं मिलता है:

Fatal error: Allowed memory size of 1895825408 bytes exhausted (tried to allocate 1029206974 bytes) ... 

इस समय मेरे स्क्रिप्ट बस है:

$file = file_get_contents('allCountries.txt') ; 

$file = str_replace(array("\r\n", "\t"), array("[NEW*LINE]", "[tAbul*Ator]"), $file) ; 

मैं -1, जो तब के लिए php.ini में स्मृति सीमा निर्धारित मुझे देता है:

Fatal error: Out of memory (allocated 1029963776) (tried to allocate 1029206974 bytes) 

वहाँ वैसे भी आंशिक रूप से फ़ाइल को खोलने और उसके बाद अगले हिस्से पर चलना होता है जिससे कम स्मृति अप करने के लिए प्रयोग किया जाता है है एक बार में?

+1

फ़ाइल लाइन को लाइन से संसाधित क्यों नहीं करते ?! –

उत्तर

10

हाँ, आप यह लाइन लाइन द्वारा पढ़ सकते हैं:

$handle = @fopen("/tmp/inputfile.txt", "r"); 
if ($handle) { 
    while (($buffer = fgets($handle, 4096)) !== false) { 
     echo $buffer; 
    } 
    fclose($handle); 
} 
+1

एक टैब से अलग फ़ाइल के लिए, कृपया सादगी –

1

आप यकीन है कि यह fopen कि नाकाम रहने के है और न अपनी स्क्रिप्ट का समय समाप्त सेटिंग कर रहे हैं? डिफ़ॉल्ट आमतौर पर लगभग 30 सेकंड या उससे अधिक होता है, और यदि आपकी फ़ाइल पढ़ने के लिए उससे अधिक समय ले रही है, तो यह उस पर ट्राइपिंग हो सकती है।

विचार करने की एक और बात आपकी स्क्रिप्ट पर स्मृति सीमा हो सकती है - फ़ाइल को सरणी में पढ़ना इस पर यात्रा कर सकता है, इसलिए स्मृति चेतावनियों के लिए अपना त्रुटि लॉग जांचें।

यदि उपरोक्त में से कोई भी आपकी समस्या नहीं है, तो आप लाइन-दर-लाइन में फ़ाइल को पढ़ने के लिए fgets का उपयोग कर सकते हैं, जैसे ही आप जाते हैं।

$handle = fopen("/tmp/uploadfile.txt", "r") or die("Couldn't get handle"); 
if ($handle) { 
    while (!feof($handle)) { 
     $buffer = fgets($handle, 4096); 
     // Process buffer here.. 
    } 
    fclose($handle); 
} 

संपादित

पीएचपी एक त्रुटि फेंक प्रतीत नहीं होता है, यह सिर्फ झूठी देता है।

क्या $rawfile का मार्ग स्क्रिप्ट चल रहा है, इसके ठीक सापेक्ष है? शायद फ़ाइल नाम के लिए एक पूर्ण पथ स्थापित करने का प्रयास करें।

+0

के लिए fgetcsv() का उपयोग करें यदि मैं फ़ाइल को स्मृति में लोड करता हूं तो यह लगभग 2 सेकंड में होता है, त्रुटि str_replace के साथ होती है लेकिन मैं रेखा सुझाव से लाइन को आज़माउंगा। – imperium2335

+0

त्रुटि str_replace के साथ होती है क्योंकि इस मामले में php स्मृति के समान आकार को किसी अन्य चर में कॉपी करने का प्रयास करता है –

2

आपको फ़ाइल को पढ़ने के लिए ब्लॉक का उपयोग करना होगा। इस सवाल का जवाब देखें। https://stackoverflow.com/a/6564818/1572528

आप इसे कम बड़ी फ़ाइलों के लिए उपयोग करने का भी प्रयास कर सकते हैं। फ़ाइल आप पढ़ना चाहते हैं में से कितने को

http://www.php.net/manual/en/function.fread.php

string fread (resource $handle , int $length) 

सेट $ लंबाई:

ini_set('memory_limit', '32M'); //max size 32m 
1

हाँ, इस के लिए fopen और fread/fgets का उपयोग करें। $ हैंडल नए पढ़ने के लिए स्थिति को बचाता है, फिर भी आप फिसके के साथ स्थिति को भी सेट कर सकते हैं ....