आप टी के साथ NSData +dataWithContentsOfFile:options:error:
उपयोग कर सकते हैं तो अगले हिस्सा पढ़ा वह NSDataReadingMappedIfSafe
विकल्प को लोड करने के बजाय अपनी फ़ाइल को स्मृति में मैप करने का विकल्प। ताकि आईओएस में वर्चुअल मेमोरी मैनेजर का उपयोग यह सुनिश्चित करने के लिए किया जा सके कि फाइल के बिट्स रैम में और बाहर से बदल दिए गए हैं जैसे डेस्कटॉप ओएस अपनी ऑन-डिस्क वर्चुअल मेमोरी फाइल को संभालता है। इसलिए आपको पूरी फ़ाइल को स्मृति में एक साथ रखने के लिए पर्याप्त रैम की आवश्यकता नहीं है, आपको बस प्रोसेसर के पता स्थान (इसलिए, गीगाबाइट्स) में फ़िट होने के लिए पर्याप्त छोटा होने की आवश्यकता है। आपको एक ऑब्जेक्ट मिलेगा जो सामान्य NSData
की तरह कार्य करता है, जो आपको NSFileHandle
का उपयोग करने और मैन्युअल रूप से स्ट्रीमिंग से संबंधित अधिकांश परेशानी को बचाएगा।
आप शायद तब NSString
के कुछ भागों में परिवर्तित करने के बाद आप वास्तविक कि UTF-8 से किसी अन्य स्वरूप में परिवर्तित करने के लिए (हालांकि यह नहीं हो सकता है उम्मीद कर सकते हैं की आवश्यकता होगी, यह एक -initWithData:encoding:
के साथ जाने के लिए होने और देखने लायक है, चाहे NSString बहुत चालाक है सिर्फ मूल डेटा का संदर्भ रखने और मांग पर यूटीएफ -8 से विस्तार करने के लिए), जो मुझे लगता है कि आपका प्रश्न वास्तव में क्या हो रहा है।
मेरा सुझाव है कि आप -initWithBytes:length:encoding:
का उपयोग स्ट्रिंग में उचित बाइट्स को परिवर्तित करने के लिए करें। इसके बाद आप यह पता लगाने के लिए -lengthOfBytesUsingEncoding:
का उपयोग कर सकते हैं कि वास्तव में कितने बाइट्स ने वास्तव में आपके पढ़ने वाले सूचक को उचित रूप से समझ लिया है और अग्रिम कर दिया है। यह एक सुरक्षित धारणा है कि NSString
आपके द्वारा प्रदान किए गए बाइट्स के अंत में किसी भी भाग वर्ण को त्याग देगा।
संपादित करें: हां, तो कुछ इस तरह:
// map the file, rather than loading it
NSData *data = [NSData dataWithContentsOfFile:...whatever...
options:NSDataReadingMappedIfSafe
error:&youdDoSomethingSafeHere];
// we'll maintain a read pointer to our current location in the data
NSUinteger readPointer = 0;
// continue while data remains
while(readPointer < [data length])
{
// work out how many bytes are remaining
NSUInteger distanceToEndOfData = [data length] - readPointer;
// grab at most 16kb of them, being careful not to read too many
NSString *newPortion =
[[NSString alloc] initWithBytes:(uint8_t *)[data bytes] + readPointer
length:distanceToEndOfData > 16384 ? 16384 : distanceToEndOfData
encoding:NSUTF8StringEncoding];
// do whatever we want with the string
[self doSomethingWithFragment:newPortion];
// advance our read pointer by the number of bytes actually read, and
// clean up
readPointer += [newPortion lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
[newPortion release];
}
बेशक, एक अंतर्निहित धारणा है कि सभी को UTF-8 एनकोडिंग अद्वितीय हैं, मैं काफी जानकार निरपेक्ष कुछ के लिए कहने के लिए किया जा रहा है के लिए नहीं स्वीकार करना होगा जो है।
यह फ़ाइल कितनी बड़ी है? मेगाबाइट? गीगाबाइट? –
हमें बताएं कि फ़ाइल का आकार 5 एमबी है, हालांकि मैं नहीं देख सकता कि यह वास्तव में मायने रखता है। –