puede utilizar NSData +dataWithContentsOfFile:options:error:
con t él NSDataReadingMappedIfSafe
opción para asignar su archivo a la memoria en lugar de cargarlo. Así que usará el administrador de memoria virtual en iOS para garantizar que los bits del archivo se intercambien dentro y fuera de la RAM de la misma forma que un sistema operativo de escritorio maneja su archivo de memoria virtual en disco. Por lo tanto, no necesita suficiente RAM para mantener todo el archivo en la memoria a la vez, solo necesita que el archivo sea lo suficientemente pequeño como para caber en el espacio de direcciones del procesador (por lo tanto, gigabytes). Obtendrá un objeto que actúa exactamente como un NSData
normal, lo que le ahorrará la mayor parte de la molestia relacionada con el uso de un NSFileHandle
y la transmisión manual.
Es probable que este caso es necesario para convertir porciones de NSString
ya que realmente puede esperar que convertir de UTF-8 a otro formato (aunque tal vez no; vale la pena tener un ir con -initWithData:encoding:
y viendo si NSString es lo suficientemente inteligente solo para mantener una referencia a los datos originales y expandirse a partir de UTF-8 bajo demanda), que creo que es a lo que su pregunta realmente está llegando.
Sugiero que use -initWithBytes:length:encoding:
para convertir una cantidad razonable de bytes en una cadena. A continuación, puede usar -lengthOfBytesUsingEncoding:
para averiguar cuántos bytes tiene sentido y avanzar su puntero de lectura de forma adecuada. Es una suposición segura que NSString
descartará cualquier carácter de parte al final de los bytes que proporcione.
EDIT: así, algo así como:
// 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];
}
Por supuesto, un supuesto implícito es que todos UTF-8 codificaciones son únicos, que tengo que admitir que no es lo suficientemente eficiente para decir con absoluta certeza.
¿Qué tan grande es este archivo? Megabytes? Gigabytes? –
Digamos que el tamaño del archivo es de 5 MB, aunque no puedo ver que realmente importe. –