gpt4 book ai didi

ios - 无法在 iOS 设备中写入大文件(> 200MB,在我的情况下为 700MB)?

转载 作者:行者123 更新时间:2023-11-28 22:40:02 25 4
gpt4 key购买 nike

我在 iOS 设备 (iPad) 中写入大文件 (>200 MB) 时遇到问题,但在模拟器中它运行完美。
我正在使用 NSFileManager 创建文件并使用 NSFileData 写入文件。我认为我的代码没有问题,因为它在模拟器中运行良好。有没有人遇到同样的问题?

详细说明我的情况:

我正在我的设备中保存大量文件(每个 3MB),工作正常。这意味着对于一个 300 MB 的文件,我有 100 个 block 。现在,我想从这 100 个 block 中创建实际文件。所以我使用 NSFileManager 在第一次迭代中创建文件,然后使用 NSFileData 在文件末尾写入 3MB 数据。在运行程序时,它在 61 个 block 后崩溃。我猜测 iPad 中可能存在一些与内存相关的问题。

我将文件 block 保存在 fileDir 中,格式为 data-0、data-1、data-2...我正在对数据应用解密操作,但为简单起见,我已删除该部分。

// List of chunk files        
NSArray *filelist= [[NSFileManager defaultManager] contentsOfDirectoryAtPath:fileDir error:err];
for(int i = 0; i < [filelist count]; i++) {
// Read the chunk of file
fileName = [[NSString alloc] initWithFormat:@"data-%d", i];
filePath = [fileDir stringByAppendingPathComponent:fileName];
fileReadHandle = [NSFileHandle fileHandleForReadingAtPath:filePath];

// Write in tempFile
if(offset == 0){
if([[NSFileManager defaultManager] createFileAtPath:tempFile contents:data attributes:nil]){
fileWriteHandle = [NSFileHandle fileHandleForWritingAtPath:tempFile];
NSLog(@"File was created!");
} else {
NSLog(@"File was not created.");
}
} else {
[fileWriteHandle seekToEndOfFile]; // Tried with comment out this line but same problem
// Write the decrypted data from chunk
[fileWriteHandle writeData:[[fileReadHandle readDataToEndOfFile] decryptedAES256DataUsingKey:AESEncryptionKey error:err]];
}
}

编辑 (11.02.2013)我尝试使用我以前的代码,其中省略了数据解密部分。有趣的是,问题出在解密部分,我猜是因为没有解密就可以正常工作。我已经添加了解密代码。对于解密,我使用的是 NSData+CommonCrypto 库(它不是 ARC),但我的项目是在 ARC 中。

最佳答案

这可能是操作系统问题,因为 NSFileHandle 永远不会为每个 block 关闭。我建议关闭它。

此外,您似乎在 for 循环范围之外声明了变量。除非您需要循环外的那些变量,否则通常最好使变量的范围尽可能小,尤其是在您使用 ARC 并试图考虑何时释放内存时。

如果您认为 NSFileHandle 正在保存内存中的数据,请尝试在写入每个 block 后使用 -synchronizeFile 方法以确保内存中的更改反射(reflect)到磁盘。

此外,我将您正在写入的文件的创建移到了循环之外,因为这对我来说更容易理解。

试试这个调整:

// List of chunk files        
NSArray *filelist= [[NSFileManager defaultManager] contentsOfDirectoryAtPath:fileDir error:err];

if([[NSFileManager defaultManager] createFileAtPath:tempFile contents:[NSData data] attributes:nil]){
NSLog(@"File was created!");
} else {
NSLog(@"File was not created.");
}

NSFileHandle *fileWriteHandle = [NSFileHandle fileHandleForWritingAtPath:tempFile];

for(int i = 0; i < [filelist count]; i++) {
// Read the chunk of file
NSString *fileName = [NSString stringWithFormat:@"data-%d", i];
NSString *filePath = [fileDir stringByAppendingPathComponent:fileName];

NSFileHandle *fileReadHandle = [NSFileHandle fileHandleForReadingAtPath:filePath];
NSData *data = [fileReadHandle readDataToEndOfFile];

// No longer using the file
[fileReadHandle closeFile];

// Write in tempFile
[fileWriteHandle writeData:data];
[fileWriteHandle synchronizeFile];// Flush any data in memory to disk
}

[fileWriteHandle closeFile];

关于ios - 无法在 iOS 设备中写入大文件(> 200MB,在我的情况下为 700MB)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14795110/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com