私の同僚と私は、この問題を理解しようとすると、時間のキラーを抱えています。ファイル(カスタムメイドの3Dオブジェクトファイル)を解析したいと思います。問題は、fread、fseekなどのstdio関数呼び出しを使用することです。
以下のコードでは、呼び出し前と呼び出し後に仮想メモリをチェックすると、関数を実行するたびに1MBのように失われ、なぜこれが発生するのかわかりません。
FILE *fp= fopen([path UTF8String], "rb");
char *buffer = (char *) malloc(MAX_STRING_LENGTH);
while(!feof(fp))
{
fgets(buffer, MAX_STRING_LENGTH, fp);
}
if(0 == fclose(fp))
NSLog(@"File is closed");
free(buffer)
パスはiosライブラリから生成され、MAX_STRING_LENGTHは任意の数(例:2000000)です。
また、例ではhttp://www.cplusplus.com/reference/clibrary/cstdio/fread/の関数を使用しましたが、それでもメモリエラーが続きます。
バッファを作成して解放するだけではメモリは使用されないため、バッファは問題ではないことを知っていますが、whileループを使用すると、ファイルを閉じて使用可能なメモリを確認した後、以前より1MB少なくなります。 。この1週間、私と同僚はこれを修正しようと夢中になっています。
編集::
- (float)print_usage_memory
{
vm_statistics_data_t vmStats;
mach_msg_type_number_t infoCount = HOST_VM_INFO_COUNT;
host_statistics(mach_host_self(), HOST_VM_INFO, (host_info_t)&vmStats, &infoCount);
const int availablePages = vmStats.free_count;
float availableMemory = [self pagesToMB:availablePages];
/*
*/
const int totalPages = vmStats.wire_count + vmStats.active_count + vmStats.inactive_count + vmStats.free_count;
const int activePages = vmStats.active_count;
const int wiredPages = vmStats.wire_count;
const int purgeablePages = vmStats.purgeable_count;
NSMutableString* txt = [[NSMutableString alloc] initWithCapacity:512];
[txt appendFormat:@"\nTotal: %d (%.2fMB)\n", totalPages, [self pagesToMB:totalPages]];
[txt appendFormat:@" nAvailable: %d (%.2fMB)\n", availablePages, availableMemory];
[txt appendFormat:@" nActive: %d (%.2fMB)\n", activePages, [self pagesToMB:activePages]];
[txt appendFormat:@"nWired: %d (%.2fMB)\n", wiredPages, [self pagesToMB:wiredPages]];
[txt appendFormat:@"nPurgeable: %d (%.2fMB)\n", purgeablePages, [self pagesToMB:purgeablePages]];
NSLog(@"%@", txt);
[txt release];
txt = nil;
return availableMemory;
}
- (float)pagesToMB:(const int)pages
{
return pages*4/1024;
}
あなたが与えることができるかもしれないどんな助け、またはこれへのどんな洞察にも感謝します。