0

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

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。

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

4

1 回答 1

1
    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:options:error: 可用于节省内存您可以使用 NSDataReadingMappedAlways 是要始终映射的文件或 NSDataReadingMappedIfSafe 以确保安全。参考https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSData_Class/Reference/Reference.html

于 2013-05-28T09:20:55.847 回答