ios加载大文件使用内存映射失败

时间:2013-05-28 08:58:11

标签: ios

使用以下方法映射大文件失败。

NSData *mappedData = [NSData dataWithContentsOfFile:self.videoPath options:NSDataReadingMappedAlways error:&error];

或地图:

int fd = open([path fileSystemRepresentation], O_RDONLY);
struct stat statbuf;
if (fstat(fd, &statbuf) == -1) {
    close(fd);
    return nil;
}

void *mappedFile;
mappedFile = mmap(0, statbuf.st_size, PROT_READ, MAP_FILE|MAP_SHARED, fd, 0);
close(fd);
if (mappedFile == MAP_FAILED) {
    NSLog(@"Map failed, errno=%d, %s", errno, strerror(errno));
    return nil;
}

// Create the NSData
NSData *mappedData = [NSData dataWithBytesNoCopy:mappedFile length:statbuf.st_size freeWhenDone:NO];`

内存映射失败,mappedData将整个文件加载到RAM。

为什么失败了?还有其他建议吗?

1 个答案:

答案 0 :(得分:0)

    NSFileManager *fileManager = [NSFileManager defaultManager];

    NSString *applicationDirectory = [NSString stringWithFormat:@"%@", [[fileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]];

    NSString *filePath = [NSString stringWithFormat:@"%@%@", applicationDirectory, fileNameWithExtension];

   // NSData *fileData = [NSData dataWithContentsOfFile:filePath];
NSData *fileData = [NSData dataWithContentsOfFile:filePath options:NSDataReadingMappedAlways error:&error];

您只能使用NsData将文件存入内存。但是如果需要缓存读取文件而不是一次将整个内容加载到内存中,则可以使用NSfileHandler。由于文件似乎是一个视频文件,我更喜欢用NSfilehandler缓冲它。

编辑:+ dataWithContentsOfFile:选项:错误:可以用来节省内存你可以使用NSDataReadingMappedAlways是要永远映射的文件或NSDataReadingMappedIfSafe是安全的。请参阅https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSData_Class/Reference/Reference.html