使用以下方法映射大文件失败。
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。
为什么失败了?还有其他建议吗?
答案 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