मेरे पास पूर्णांक की गतिशील आवंटित सरणी है जिसमें मैं मनमानी स्थितियों पर पूर्णांक डालना चाहता हूं। 2.5 मिलियन से अधिक में कई पूर्णांक।मैं सरणी में एकाधिक प्रविष्टियों को कुशलतापूर्वक कैसे संभाल सकता हूं?
मेरे कोड वर्तमान में इस तरह दिखता है:
type
TIntegerArr = array of Integer;
var
FCount: Integer;
FSortedList: TIntegerArr;
procedure Insert(_Value: Integer; _InsertPos: integer);
var
OldList: TIntegerArr;
begin
OldList := FSortedList;
if Length(FSortedList) < FCount + 1 then begin
OldList := FSortedList;
FSortedList := nil;
SetLength(FSortedList, FCount + 100);
CopyMemory(@FSortedList[0], @OldList[0], SizeOf(Integer) * _InsertPos);
end;
MoveMemory(@FSortedList[_InsertPos + 1], @OldList[_InsertPos], SizeOf(Integer) * (FCount - _InsertPos));
FSortedList[_InsertPos] := _Value;
Inc(FCount);
end;
एक अस्थायी सूची का उपयोग करना और के बजाय ले जाएँ का उपयोग कर (वास्तविक कोड एक वर्ग है कि खेतों के रूप में FSortedList और FCount है की एक विधि है।) डेटा को स्थानांतरित करने के लिए लूप के लिए प्रदर्शन में काफी सुधार हुआ है क्योंकि यह बढ़ने के बाद सरणी को दो बार कॉपी करने से रोकता है (एक बार मौजूदा सरणी पर सेटलेथेंथ में और मूव के साथ एक और समय)।
लेकिन सबसे खराब केस सम्मिलित करें (कुछ वैल्यू, 0) अभी भी सभी मौजूदा मानों को हमेशा चलाता है।
अब तक मैं सरणी की शुरुआत में ऑफसेट शुरू करने की लाइनों के साथ सोच रहा था, इसलिए हर मौजूदा मूल्य को हर बार एक नया मूल्य डालने के बजाय, मौजूदा समय में स्थानांतरित करने की बजाय, मैं ऑफसेट कर सकता था तक पहुँच जाता है 0. उदाहरण के लिए:
// simple case: inserting at Position 0:
if FOffset = 0 then begin
// [...] reallocate a new array as above
Move(@FSortedList[100], @OldList, SizeOf(Integer) * _InsertPos);
FOffset := 100;
end;
Dec(FOffset);
FSortedList[FOffset] := _NewValue;
निश्चित रूप से यह है कि क्या सम्मिलन बिंदु शुरुआत या अंत के नजदीक और कहा कि इस कदम के आधार पर या तो पहले है की जाँच करने के लिए बढ़ाया जा सकता है (यह कोड अपरीक्षित और शायद गाड़ी है) या अंतिम मान एक स्थिति से है ताकि औसत पर केवल 1/4 प्रविष्टियों को 1/2 के बजाय स्थानांतरित किया जाना चाहिए जैसा कि वर्तमान में है।
एक और विकल्प एक स्पैस सरणी लागू करेगा। मुझे 1 99 0 के दशक में कुछ वाणिज्यिक पुस्तकालय में इस तरह के कार्यान्वयन को याद रखना याद है, लेकिन याद नहीं है कि यह कौन सा था (टर्बोपावर?)।
यह प्रक्रिया कुछ सॉर्टिंग और इंडेक्सिंग कोड के लिए केंद्रीय है जो विभिन्न आकारों के सरणी पर काम करती है, उपर्युक्त लाखों प्रविष्टियों तक केवल कुछ दर्जन प्रविष्टियों से।
वर्तमान में प्रोग्राम लगभग 2 घंटे चलता है (मेरे अनुकूलन से पहले यह 5 घंटे के करीब था) और मुझे पहले से ही पता है कि सरणी में प्रविष्टियों की संख्या कम से कम दोगुनी हो रही है। जैसा कि सम्मिलन प्रदर्शन खराब हो जाता है, सरणी पहले से ही बड़ी है, मुझे संदेह है कि प्रविष्टियों की संख्या दोगुनी है, रन टाइम कम से कम चौगुनी होगी।
मुझे प्रदर्शन को ट्यून करने के बारे में कुछ सुझाव चाहिए। मेमोरी खपत वर्तमान में एक मुद्दा नहीं है लेकिन रन टाइम निश्चित रूप से है।
(यह डेल्फी 2007 लेकिन वह बहुत अधिक अंतर नहीं करना चाहिए जब तक कि नए डेल्फी संस्करण पहले से ही ऊपर करने के लिए एक अनुकूलित पुस्तकालय है Classes.TList अनुकूल नहीं है।।)
Edit1: बस विरल पाया सरणी कार्यान्वयन मैंने उपर्युक्त उल्लेख किया है: यह टर्बोपावर SysTools से StColl है।
संपादित 2: ठीक है, कुछ पृष्ठभूमि: मेरा प्रोग्राम वर्तमान में 2.4 मिलियन प्रविष्टियों के साथ एक डीबेस तालिका पढ़ता है और इन प्रविष्टियों से कई नई टेबल उत्पन्न करता है। नई टेबल सामान्यीकृत की जाती हैं और उन्हें बनाए जाने के बाद अनुक्रमित किया जाता है (प्रदर्शन कारणों से मैं डेटा डालने से पहले इंडेक्स उत्पन्न नहीं करता हूं, मेरा विश्वास करो, मैंने पहले इसे आजमाया।)। सरणी कोड का केंद्रीय टुकड़ा है जो जेनरेट टेबल के लिए आंतरिक सॉर्टिंग प्रदान करता है। नए रिकॉर्ड केवल तालिका में संलग्न होते हैं, लेकिन उनके रिकनो को क्रमबद्ध क्रम में सरणी में डाला जाता है।
['@ @ रनर'] द्वारा [' बेहतर कटा हुआ ऐरे कार्यान्वयन'] (http://www.cromis.net/blog/2013/03/improved-sliced-array-implementation/) देखें (http: // stackoverflow.com/users/118765/runner) अगर यह कोई इनपुट देता है कि सॉर्टिंग को बेहतर तरीके से कैसे बनाया जाए। –
@LURD: धन्यवाद। जब मैंने इसे लिखा था तो मैंने इस ब्लॉग पोस्ट को पढ़ा था (उस पृष्ठ पर पहली टिप्पणी मेरा है) लेकिन पहले से ही भूल गई थी। – dummzeuch
इस "डालने योग्य सरणी" के लिए उपयोग के मामलों के बारे में हमें और बताएं। संभावित समाधान उन पर निर्भर करते हैं। – MBo