मैं Laravel में एक स्क्रिप्ट है कि लाइन द्वारा एक JSON फ़ाइल लाइन पढ़ता है और मेरी डेटाबेस में सामग्री का आयात करता है का निर्माण किया है के साथ mysql में एक लाख पंक्तियों डालने स्मृति समाप्त हो रहा रोकूँ।मैं कैसे जब php
हालांकि, जब स्क्रिप्ट चलाने, मैं स्मृति त्रुटि के बाहर 80K के बारे में रिकॉर्ड डालने के बाद मिलता है।
mmap() failed: [12] Cannot allocate memory
mmap() failed: [12] Cannot allocate memory
PHP Fatal error: Out of memory (allocated 421527552) (tried to allocate 12288 bytes) in /home/vagrant/Code/sandbox/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php on line 1758
mmap() failed: [12] Cannot allocate memory
PHP Fatal error: Out of memory (allocated 421527552) (tried to allocate 32768 bytes) in /home/vagrant/Code/sandbox/vendor/symfony/debug/Exception/FatalErrorException.php on line 1
मैं केवल प्रतिबद्ध एकत्रित आइटम को हर 100 के लिए अस्थायी कतार का एक तरह का निर्माण किया है, लेकिन यह कोई फर्क नहीं बनाया है।
public function callback($json) {
if($json) {
$this->queue[] = [
'type' => serialize($json['type']),
'properties' => serialize($json['properties']),
'geometry' => serialize($json['geometry'])
];
if (count($this->queue) == $this->queueLength) {
DB::table('features')->insert($this->queue);
$this->queue = [];
}
}
}
यह वास्तविक आवेषण (DB::table('features')->insert($this->queue);
) कि त्रुटि उत्पन्न कर रहे है, अगर मैं उन बाहर छोड़ मैं पूरी तरह से सब कुछ खत्म पुनरावृति कर सकते हैं:
यह वही मेरी कोड है कि आवेषण करता है का हिस्सा लगता है कि है लाइनों और किसी भी प्रदर्शन के मुद्दों के बिना उन्हें गूंज।
मुझे लगता है कि मैं अधिक स्मृति आवंटित कर सकता हूं, लेकिन संदेह है कि यह एक समाधान होगा क्योंकि मैं 3 मिलियन रिकॉर्ड डालने की कोशिश कर रहा हूं और यह वर्तमान में 8012 के बाद आवंटित 512 एमबी स्मृति के साथ विफल रहा है। इसके अलावा, मैं वास्तव में कम स्क्रिप्ट सर्वर पर इस स्क्रिप्ट को चलाने के लिए चाहता हूं।
समय यह इस स्क्रिप्ट के लिए ले जाता है चलाने के लिए तो अगर मैं किसी भी तरह के रिकॉर्ड की प्रविष्टि को धीमा कर सकता है नीचे है कि एक समाधान मैं के लिए समझौता कर सकता है हो सकता है, किसी भी चिंता का विषय नहीं है।
लारवेल ओवरहेड होने के लिए बाध्य है, इसलिए मैं इसे –
शुरू करने के लिए उपयोग करना बंद कर दूंगा। आखिरी बार मुझे यह करना पड़ा, मैंने एक क्रॉन स्क्रिप्ट लिखी जो प्रत्येक एन घंटों में दौड़ गई और एन रिकॉर्ड ले ली, एक ध्वज के साथ संसाधित रिकॉर्ड अपडेट कर रहा था। प्रत्येक बार एक बार में स्क्रिप्ट विफल हो जाएगी, लेकिन यह अनप्रचारित रिकॉर्ड चुनकर बस पुनरारंभ होगा। सबसे अच्छा समाधान नहीं है (संभावित ओवरलैपिंग के लिए मापना, एक के लिए, उम्मीद है कि यहां कोई व्यक्ति इस पर प्रकाश डालेगा। संपादित करें: डैगन का एक बिंदु भी है, यदि आप इसे कस्टम बनाना चाहते हैं तो यह महत्वपूर्णता में वृद्धि करेगा। –
आप एक में पास कर सकते हैं अपनी कॉलबैक() विधि में एन पंक्तियों की सीमा निर्धारित करें, जो भी आप * प्रक्रिया कर सकते हैं * एक ही समय में प्रक्रिया कर सकते हैं। अपनी विधि के अंत में, अपनी पंक्ति में अगले बैच को संसाधित करने के लिए एन पंक्तियों + एन की वृद्धि के साथ अपने पृष्ठ पर वापस रीडायरेक्ट करें जब तक यह खाली न हो। – Landjea