2015-01-22 10 views
7

मैं अस्थायी तालिकाओं से चारों ओर 100k रिकॉर्ड खींच रहा हूँ, डेटा पर कुछ मामूली संशोधन कर रही है, फ़ोटो डाउनलोड करने, और फिर खेतों मैं एक "मास्टर" तालिका में रखने की जरूरत है डाल। यह जल्दी से मेरे ऐप को दुर्घटनाग्रस्त कर रहा है क्योंकि यह स्मृति से बाहर चला जाता है।स्मृति से बाहर निकलने से बचने के लिए मैं लैरवेल के हिस्से का उपयोग कैसे करूं?

मैं Laravel के वाक्पटु ORM के साथ हिस्सा() का उपयोग करने पर बहुत ही संक्षिप्त डॉक्स पढ़ा लेकिन पता नहीं कैसे भी मेरी कक्षा में इसे लागू करने के लिए शुरू करने के लिए।

public function fire() 
{ 
    // Turn off query logging 
    DB::connection()->disableQueryLog(); 

    $feeds = RetsFeed::where('active','=',1)->get(); 
    foreach ($feeds as $feed) 
    { 

     $class = "TempListing{$feed->board}"; 

     $listings = $class::orderBy('MatrixModifiedDT','desc')->get(); 

     $listings->each(function($listing) use ($feed) { 
      ListingMigrator::migrateListing($listing,$feed); 
      echo "Feed: $feed->board\r\n"; 
      echo "SubcondoName: $listing->SubCondoName\r\n"; 
      echo "Development: $listing->Development\r\n"; 
      echo "\r\n"; 
     }); 
    } 

} 

प्रत्येक फ़ीड (या डेटा स्रोत) एक अलग घर का काम में एक अस्थायी तालिका में फेंक दिया जाता है:

यहाँ मैं वर्तमान में क्या कर रहा हूँ है। यह ठीक काम करता है। फिर, मैं एक टेबल से बाहर सभी एचटीई लिस्टिंग लेता हूं (जो औसत पर लगभग 30k है) और मेरी लिस्टिंगमिगर विधि चलाएं।

कहाँ मैं इस उदाहरण में हिस्सा रख सकता हूं? यह लाइन की जगह लेंगे:

$listings = $class::orderBy('MatrixModifiedDT','desc')->get(); 

मैं पूरी तरह से वाक्पटु डॉक्स में बंद नहीं समझते। यह सब वे इसके बारे में क्या कहना है और यहाँ Laravel साइट से कोड उदाहरण है:

User::chunk(200, function($users) 
{ 
    foreach ($users as $user) 
    { 
     // 
    } 
}); 

उत्तर

14

chunk कॉल get कॉल की जगह चाहिए - यह पहले से मिलता है() क्वेरी बिल्डर वस्तु पर काम करने के लिए डिज़ाइन किया गया है ।

$listings = $class::orderBy('MatrixModifiedDT','desc'); 

$listings->chunk(200, function($listings) use($feed) { 
    $listings->each(function($listing) use ($feed) { 
     ListingMigrator::migrateListing($listing,$feed); 
     echo "Feed: $feed->board\r\n"; 
     echo "SubcondoName: $listing->SubCondoName\r\n"; 
     echo "Development: $listing->Development\r\n"; 
     echo "\r\n"; 
    }); 
}); 
+1

ऐसा लगता है कि यह एक आकर्षण की तरह काम करता है! उत्तर देने में आपकी उदारता के लिए धन्यवाद। मेरा एक सवाल यह है कि हम कैसे हिस्सा के लिए 200 नंबर निर्धारित करते हैं। मेरी समझ यह है कि यह कई लोगों को संसाधित करता है और फिर मूल रूप से बेहतर शब्द की कमी के लिए "शुरू होता है"। क्या यह सुरक्षित नहीं होगा कि यह संख्या वास्तव में कम है, जैसे 10 भी? क्या अतिरिक्त डेटाबेस कॉल करने की एकमात्र लागत है? –

+2

@ChrisFarrugia Chunk आकार बहुत मनमाना है और केवल हार्ड आवश्यकता यह है कि यह एक छोटा सा संख्या है ताकि आप एक ही हिस्से में रैम से बाहर नहीं निकल सकें। यदि आपका डेटाबेस लोड को ध्यान में रखता है, तो 10 के भाग ठीक हैं। 200 के टुकड़े भी ठीक हैं। – ceejayoz

+2

नोट: यदि 'chunk' को संशोधित करने के रिकॉर्ड, इस तरह के नरम हटाए गए, हार्ड हटाए गए, क्वेरी आदि में स्तंभ के परिवर्तन के रूप में है कि क्वेरी को प्रभावित कर सकता शामिल है, तो आप थोड़ी देर के बयान के साथ हिस्सा चारों ओर की जरूरत है। कृपया http://stackoverflow.com/questions/32700537/eloquent-chunk-missing-half-the-results और संभवतः http://laravel.io/forum/09-22-2015-chunk-missing-half-the देखें -results? पृष्ठ = 1 – brianlmerritt

संबंधित मुद्दे