2011-05-27 14 views
5

कारण के लिए कि मैं यहां चर्चा नहीं करूंगा, मुझे फ़ाइलों की एक बड़ी निर्देशिका का विश्लेषण करने के लिए मजबूर होना पड़ता है (हम 100.000 < x < 1.000.000+) बात कर रहे हैं और फ़ाइललिस्ट को एक के रूप में वापस कर सकते हैं सरणी।विशाल arrays पर नकारात्मक ऑफसेट के साथ array_slice

मैं पहले ही फाइल सूची को कैशिंग कर रहा हूं, समस्या array_slice है।

हाँ, एक पकड़ने है, क्योंकि, फ़ाइल की इस सूची में "पृष्ठवार" होना चाहिए उन्हें 16.

के ब्लॉक में लौटने क्या मैं कर रहा हूँ यह है:

$items_per_page = 16; 
$offset = ($current_page * $items_per_page) + $items_per_page; 
array_slice($array,-$offset,$items_per_page); 

यह आसान है देखें कि कुछ पृष्ठों में हमारे पास विशाल ऑफसेट होंगे। पेज चार (ऑफसेट = -80) से भी शुरू होता है, वहां एक बड़ा प्रदर्शन हिट होता है।

इस प्रकार के सरणी अंकन को प्राप्त करने के लिए array_slice के बजाय मैं क्या उपयोग कर सकता हूं?

धन्यवाद

+0

** एक ** निर्देशिका में 100k फ़ाइलें केवल गलत कार्यान्वयन है ... – zerkms

+0

हां यह बहुत गलत है। लेकिन मुझे यही काम करना है, यह मेरी पसंद नहीं है, समय सीमा के बाद मैं इस गड़बड़ी को बदलना सुनिश्चित करूँगा। – 0plus1

+0

'preserve_keys' का उपयोग करने से मदद मिल सकती है (हालांकि सुनिश्चित नहीं है)। 'array_slice ($ array, - $ ऑफसेट, $ item_per_page, true);' –

उत्तर

4

यदि सरणी संख्यात्मक रूप से अनुक्रमित है (संख्या छोड़ने के बिना) तो आप लूप के लिए उपयोग करने का प्रयास कर सकते हैं।

$items_per_page = 16; 
$offset = ($current_page * $items_per_page) + $items_per_page; 
$chunk = array(); 
for($i=$offset;$i<$offset+$items_per_page;$i++){ 
    $chunk[] = $files[$i]; 
} 

संपादित करें:

मैं सिर्फ एक विचार प्राप्त करने के लिए कुछ बेंच मार्किंग था। हमारे सर्वर पर, 1 मिलियन आइटमों की सरणी के साथ, प्रत्येक बार 100 बार संसाधित किया गया, array_slice() ने प्रक्रिया के लिए 2.568 9ms लिया। लूप का उपयोग करने से 0.0031ms लगे।

+0

धन्यवाद। अगर लोग इसे देखते हैं। समाधान एकदम सही है जब तक कि एक ही चीज़ के लिए, पहला पृष्ठ (0) ऑफसेट 0 होना चाहिए।तो: यदि ($ current_page> 0) {$ set = ($ current_page * $ items_per_page) + $ items_per_page;} else {$ offset = 0; } – 0plus1

+0

@ 0plus1 ऑफ़सेट की गणना करने के तरीके में कोई समस्या है। पेज 1 आपको 1 * 16 = 16 + 16 = 32 मिलेगा। पेज 0 आपको 0 प्राप्त करेगा। आप 16-31 परिणाम कभी नहीं देख पाएंगे। पृष्ठ प्राप्त करने का सही तरीका कुछ ऐसा होगा: '$ ऑफसेट = (($ current_page-1) * $ items_per_page)% गिनती ($ डेटा);' –

6

, बनाने भरने और एक डीबी तालिका जोड़ तोड़ के बजाय की स्मृति में यह सब करने के विचार करें। इस पर एक सूचकांक आपको उचित प्रदर्शन के साथ फ़ाइलों को पेजेट करने की अनुमति देगा।

+0

यह आखिरी उपाय है यदि अन्य सभी विफल हो जाते हैं .. फिर भी मैं अपने ज्ञान को बेहतर बनाने के लिए एक व्यवहार्य समाधान ढूंढना चाहता हूं। – 0plus1

+0

जोनाथन का सुझाव पहुंच के लिए तेज़ होना चाहिए, लेकिन आपको अभी भी पागल आकार के सरणी को पॉप्युलेट (और संभवतः सॉर्ट करना) की आवश्यकता होगी ... –

+0

सहमत हैं @ डेनिस ने अभी क्या कहा। डेटाबेस का उपयोग करना 1000 गुना बेहतर, तेज़, आसान होगा और आपको सॉर्टिंग और खोज जैसे अधिक कुछ करने की अनुमति देगा। यही कारण है कि यह मेरा वोट प्राप्त करता है। –

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