मैं आईओएस पर ऑडियो फ़ाइलों को पढ़ने और चलाने के लिए एमएमएपी का उपयोग करने की कोशिश कर रहा हूं। यह लगभग 400 एमबी तक फ़ाइलों के लिए ठीक काम करता है। लेकिन जब मैं 500 एमबी फ़ाइल आज़माता हूं, तो मुझे एक EohanM त्रुटि मिलती है।आईओएस पर एमएमएपी क्यों विफल रहता है?
char *path = [[[NSBundle mainBundle] pathForResource: @"test500MB" ofType: @"wav"] cStringUsingEncoding: [NSString defaultCStringEncoding]];
FILE *f = fopen(path, "rb");
fseek(f, 0, SEEK_END);
int len = (int)ftell(f);
fseek(f, 0, SEEK_SET);
void *raw = mmap(0, len, PROT_READ, MAP_SHARED, fileno(f), 0);
if (raw == MAP_FAILED) {
printf("MAP_FAILED. errno=%d", errno); // Here it says 12, which is ENOMEM.
}
क्यों?
मुझे "700 एमबी वर्चुअल मेमोरी सीमा" जैसे उत्तर से प्रसन्नता होगी, लेकिन कभी-कभी पता स्थान खंडित होता है, इसलिए आपको 700 एमबी मिलते हैं लेकिन छोटे हिस्सों में "। (यह सिर्फ अटकलें हैं, मैं अभी भी एक जवाब की जरूरत है)
आभासी स्मृति के बारे में एप्पल डॉक पेज का कहना है:
हालांकि ओएस एक्स एक समर्थन दुकान का समर्थन करता है, आईओएस नहीं करता है। आईफोन अनुप्रयोगों में, केवल पढ़ने योग्य डेटा जो डिस्क पर पहले से है (जैसे कोड पेज) को स्मृति से हटा दिया गया है और आवश्यकतानुसार डिस्क से पुनः लोड किया गया है।
जो यह पुष्टि करता है कि mmap को भौतिक स्मृति से बड़े ब्लॉक के लिए काम करना चाहिए, लेकिन अभी भी यह स्पष्ट नहीं करता है कि मैं इतनी कम सीमा क्यों मार रहा हूं।
अद्यतन
- This answer दिलचस्प है, लेकिन 500MB अच्छी तरह से 700MB सीमा यह उल्लेख नीचे है।
- This discussionसन्निहित स्मृति का उल्लेख है। तो स्मृति विखंडन एक असली मुद्दा हो सकता है?
- मैं आइपॉड टच चौथी पीढ़ी का उपयोग कर रहा हूं जिसमें 256 एमबी भौतिक स्मृति है।
- मेरे शोध का बिंदु यह देखने के लिए है कि से फ़ाइलों से केवल पढ़ने के डेटा को लोड करते समय मेमोरी को प्रबंधित करने का बेहतर तरीका है "जब तक आपको स्मृति चेतावनी नहीं मिलती तब तक आवंटित रखें"।
mmap
इस हल करने के लिए एक अच्छा तरीका की तरह लग रहा था ...
अद्यतन 2
मैं mmap iOS के नए 64 बिट संस्करण के साथ पूरी तरह से काम करने की उम्मीद। एक बार जब मैं 64 बिट डिवाइस पर अपना हाथ लेता हूं तो परीक्षण करेगा।
ठीक है, एक 500 एमबी फ़ाइल लगभग आईफोन 4 पर वास्तव में उपलब्ध मुफ्त रैम के रूप में लगभग दोगुनी है ... आप क्या उम्मीद करते हैं? 'mmap()' जादू नहीं है। –
@ एच 2CO3 मैं उम्मीद करता हूं कि यह फ़ाइल डेटा में रैम में मांग करे, क्योंकि एमएमएड क्षेत्र का उपयोग किया जाता है। क्या यह mmap करता है? –
यह एक कार्यान्वयन विस्तार है। जिस पर आपको भरोसा नहीं करना चाहिए, बी। जिसके बारे में आप उम्मीद नहीं करेंगे, सी। जिसे libSystem के स्रोत कोड के प्रासंगिक भागों को पढ़कर देखा जा सकता है। –