2010-11-06 6 views
10

मेरे पास एक सवाल है जो इतना आसान है कि मैं विश्वास नहीं कर सकता कि मैं इसे स्वयं जवाब नहीं दे सकता। लेकिन, तुम वहाँ जाओ।सी # (विंडोज फोन 7 पर सिल्वरलाइट) में एक बड़ी स्थैतिक सरणी का उपयोग करना

मेरे पास एक बड़ी आइएस स्थैतिक सूची है (शहरों, अक्षांश और अक्षांशों का) जो मैं अपने विंडोज फोन 7 सिल्वरलाइट एप्लिकेशन में उपयोग करना चाहता हूं। उनमें से लगभग 10,000 हैं। मैं अपने डेटा में इस डेटा को स्थिर रूप से एम्बेड करना चाहता हूं और इसे सरणी में एक्सेस करना चाहता हूं (मुझे कोड में पूरी सूची के माध्यम से नियमित रूप से चक्र की आवश्यकता है)।

यह संग्रहीत करने का मेरा सबसे प्रभावी माध्यम क्या होगा? एक साथ बाहर

public struct City 
{ 
    public string name; 
    public double lat; 
    public double lon; 
}; 

और फिर ...

private City[] cc = new City[10000]; 

public CityDists() 
{ 
    cc[2].name = "Lae, Papua New Guinea"; cc[2].lat = 123; cc[2].lon = 123; 
    cc[3].name = "Rabaul, Papua New Guinea"; cc[3].lat = 123; cc[3].lon = 123; 
    cc[4].name = "Angmagssalik, Greenland"; cc[4].lat = 123; cc[4].lon = 123; 
    cc[5].name = "Angissoq, Greenland"; cc[5].lat = 123; cc[5].lon = 123; 
... 

हालांकि, इस bums ": मैं एक पुराने स्कूल प्रकार का एक सा हूँ, इसलिए मैं सबसे तेज़ तरीका है करने के लिए माना यह होगा स्मृति से बाहर "कोड वास्तव में चलाने से पहले त्रुटि (मुझे लगता है कि कोड स्वयं स्मृति में लोड होने के लिए बहुत अधिक हो गया है)।

जो कुछ भी मैं ऑनलाइन पढ़ता हूं वह मुझे एक एक्सएमएल संसाधन या फ़ाइल का उपयोग करने के लिए कहता है और फिर कक्षा के उदाहरणों में deserialise करने के लिए कहता है। लेकिन क्या यह वास्तव में एक संरचना का उपयोग करने के रूप में तेजी से हो सकता है? क्या एक्सएमएल उम्र को पर्स करने के लिए नहीं लेगा?

मुझे लगता है कि मैं यहां कोड लिखने में सक्षम हूं - मुझे यकीन नहीं है कि सबसे अच्छा तरीका किस प्रकार से शुरू करना है। मुझे लोड की गति में दिलचस्पी है और (अधिक महत्वपूर्ण बात) किसी भी चीज़ से रन टाइम एक्सेस अधिक है।

किसी भी मदद की बहुत सराहना की - पहला सवाल यहां है इसलिए मुझे उम्मीद है कि मैंने कुछ भी नहीं किया है।

क्रिस

+0

हाय क्रिस, कुल मात्रा में डेटा का कितना मात्रा? आपके सिस्टम पर कितनी मेमोरी है और बहुत मुफ्त है? मुझे लगता है कि आप इमू पर परीक्षण कर रहे हैं। अगर आप मुझे यह नहीं मानते कि डेटा का स्रोत क्या है, तो मैं उत्सुक भी हूं .. मैं शहर के डेटा के लिए विकल्पों को भी देख रहा हूं। –

+0

संदर्भ के लिए 100 एक्स सरल एक्सएमएल डेटा एक्सडी दस्तावेज का उपयोग करके XAP से लोड किया जा सकता है, जो एक सूची बॉक्स में प्रदर्शित होता है और 650 मेगाहट्र्ज डिवाइस पर 0.5sec में पृथक भंडारण में सहेजा जाता है। –

+12

हाय मिक - मैं उस डेटा का उपयोग कर रहा हूं जो http://www.partow.net/miscellaneous/airportdatabase/index.html से आया था। वहां कुछ जंक है कि मैंने छीन लिया है और मैंने अक्षांश और देशांतर को मीट्रिक में परिवर्तित कर दिया है - यदि कोई तरीका है तो आप मेरे संपर्क में रह सकते हैं, मुझे अंतिम परिणाम साझा करने में खुशी होगी (यह एक्सेल स्प्रेडशीट में है अभी)। मैं एक्स डॉक्यूमेंट में देखूंगा - जो कि मेरे बाद के लिए पर्याप्त तेज़ लगता है! –

उत्तर

1

तो एक xml दस्तावेज़ को लोड करने से XAP आप के लिए काम करता है: स्थिर के रूप में अपने सरणी घोषित करने और स्थिर निर्माता में यह आरंभ प्रयास करें XDocument/LINQ के माध्यम से एक्सएपी और संदर्भ के लिए एक सूची बॉक्स में डेटाबेस।

binding a Linq datasource to a listbox

+0

यह बहुत अच्छा काम करता है, बहुत धन्यवाद। मैंने डेटा क्लीनअप समाप्त कर लिया है और मेरे पास अक्षांश और अक्षांश वाले 3000 या ऐसे शहर हैं - अगर आप इसे चाहते हैं तो कृपया संपर्क में रहें! –

+0

yw:) ... मैंने लिंक सहेजा, ty :) –

3

10,000 structs स्मृति से बाहर चलाने के नहीं करना चाहिए, लेकिन सिर्फ यकीन है कि, मैं पहली बार ऐसी है कि वह ढेर के बजाय ढेर का उपयोग करता है एक वर्ग में अपने struct मोड़ की कोशिश करेगा बनाने के लिए। एक मजबूत संभावना है कि ऐसा करने से आपकी स्मृति त्रुटियों को ठीक कर दिया जाएगा।

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

इसके अलावा, मुझे कोड नमूने में नोटिस है कि cc सरणी स्थिर घोषित नहीं किया गया है। यदि आपके पास CityDists के कुछ उदाहरण हैं, तो यह भी स्मृति को कम कर सकता है क्योंकि हर बार नया CityDists क्लास बनाया जाता है, इसलिए सरणी फिर से बनाई जा रही है। ..

यहाँ एक परियोजना मैं से एक xml दस्तावेज़ की लोडिंग का प्रदर्शन पोस्ट किया जाता है

private static City[] cc = new City[10000]; 

static CityDists() 
{ 
    cc[2].name = "Lae, Papua New Guinea"; cc[2].lat = 123; cc[2].lon = 123; 
    cc[3].name = "Rabaul, Papua New Guinea"; cc[3].lat = 123; cc[3].lon = 123; 
    cc[4].name = "Angmagssalik, Greenland"; cc[4].lat = 123; cc[4].lon = 123; 
    cc[5].name = "Angissoq, Greenland"; cc[5].lat = 123; cc[5].lon = 123; 
... 
1

आप XML पार्सिंग और स्मृति भूमि के ऊपर से बचना चाहते हैं, तो आप अपने डेटा भंडारण के लिये एक सादा पाठ फ़ाइल का उपयोग करें और प्रविष्टियों जैसे पार्स करने के लिए नेट स्ट्रिंग कार्यों tokenizer इस्तेमाल कर सकते हैं स्ट्रिंग का प्रयोग करें।स्प्लिट()

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

1

एक्सएमएल या एक साधारण सीमांकित फ़ाइल जैसी फाइल का उपयोग करना बेहतर तरीका होगा जैसा कि अन्य ने इंगित किया है। हालांकि मैं स्मृति के उपयोग को बेहतर बनाने के लिए एक और परिवर्तन भी सुझा सकता हूं।

कुछ इस तरह (हालांकि वास्तविक लोड हो रहा है एक बाहरी फ़ाइल का उपयोग किया जाना चाहिए): -

public struct City 
{ 
    public string name; 
    public string country; 
    public double lat; 
    public double lon; 
} 

private static City[] cc = new City[10000]; 
static CityDists() 
{ 
    string[] countries = new string[500]; 
    // Replace following with loading from a "countries" file. 
    countries[0] = "Papua New Guinea"; 
    countries[1] = "Greenland"; 

    // Replace following with loading from a "cities" file. 
    cc[2].name = "Lae"; cc[2].country = contries[0]; cc[2].lat = 123; cc[2].lon = 123; 
    cc[3].name = "Rabaul"; cc[3].country = countries[0]; cc[3].lat = 123; cc[3].lon = 123;    
    cc[4].name = "Angmagssalik"; cc[4].country = countries[1]; cc[4].lat = 123; cc[4].lon = 123;    
    cc[5].name = "Angissoq"; cc[5].country= countries[1]; cc[5].lat = 123; cc[5].lon = 123;    
} 

इस संरचना के आकार बढ़ जाती है थोड़ा लेकिन डुप्लिकेट देश के नाम signficantly द्वारा प्रयुक्त स्मृति कम करता है।

1

मैं आपकी निराशा सुनता हूं। डीबगर के बिना अपना कोड चलाएं, इसे ठीक काम करना चाहिए। मैं 3 सेकंड के अंदर 2 सरणी लोड कर रहा हूं, प्रत्येक में 100,000 से अधिक तत्व हैं। डीबगर रिपोर्ट "आउट ऑफ़ मेमोरी", जो कि मामला नहीं है।

ओह और आप दक्षता के बारे में सही हैं। किसी XML फ़ाइल से वही जानकारी लोड करना फ़ोन पर 30 सेकंड से अधिक समय ले रहा था।

मुझे नहीं पता कि आपके प्रश्न का उत्तर कौन दे रहा था लेकिन उन्हें वास्तव में विपणन करना चाहिए।

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