2012-03-30 59 views
3

我正在開發一個上傳應用程序,用於在上傳之前拆分文件。它將文件分割,以防止iOS使用太多內存來關閉文件,因爲某些文件可能相當大。如果可以的話,它會很好,而不是設置最大「塊」大小,設置最大內存使用量並使用它來確定大小。獲取iOS中應用程序使用的內存量

像這樣的事情

#define MAX_MEM_USAGE 20000000 //20MB 
#define MIN_CHUNK_SIZE 5000 //5KB 

-(void)uploadAsset:(ALAsset*)asset 
{ 
    long totalBytesRead = 0; 
    ALAssetRepresentation *representation = [asset defaultRepresentation]; 
    while(totalBytesRead < [representation size]) 
    { 
     long chunkSize = MAX_MEM_USAGE - [self getCurrentMemUsage]; 
     chunkSize = min([representation size] - totalBytesRead,max(chunkSize,MIN_CHUNK_SIZE));//if I can't get 5KB without getting killed then I'm going to get killed 
     uint8_t *buffer = malloc(chunkSize); 
     //read file chunk in here, adding the result to totalBytesRead 
     //upload chunk here 
    } 
} 

基本上是我要做的。我似乎無法找到一種方法來專門獲取我應用的當前內存使用情況。我真的不在乎剩下的系統內存的數量。

我能想到的唯一方法就是我不喜歡太多。搶的主要在我的應用程序第一管路系統內存量,然後將其存儲在一個全局變量類的靜態變量,則getCurrentMemUsage會去像這樣

-(long)getCurrentMemUsage 
{ 
    long sysUsage = [self getSystemMemoryUsed]; 
    return sysUsage - [Globals origSysUsage]; 
} 

這有一些嚴重的缺陷。對我來說最明顯的一點是,另一個應用程序可能會在我的上傳過程中被殺死,即使我的應用程序使用10MB的內存,可能會導致sysUsage比origSysUsage更低,從而導致負數,這可能導致我的應用程序使用40MB一個請求而不是20MB的最大值。我總是可以設置它,以便鉗住MIN_CHUNK_SIZE和MAX_MEM_USAGE之間的值,但這只是一個解決方法,而不是實際的解決方案。

如果有任何關於獲取應用程序使用的內存量或者甚至是用於管理動態塊大小的不同方法的建議,我將不勝感激。

+0

我只想用256KB塊,並用它做。大塊比那大塊有一些顯着的優勢嗎? – 2012-03-30 19:01:03

+0

@DavidSchwartz只是它顯着加快了上傳過程。用戶可能正在上傳超過1GB大小的文件,因此需要大量的大塊上傳文件。這需要20MB大量的塊,但仍然優於256KB(或其他一些較小的值)。另外,有些文件不需要完整的20MB內存來上傳(例如JPEG格式)。我們的這個應用程序的目標是儘可能快地上傳儘可能少的請求,而不會耗盡內存。 – nick 2012-03-30 19:07:06

+0

至少它加速了Android上的上傳過程,我敢肯定它也會在iOS設備上運行 – nick 2012-03-30 19:08:19

回答

0

現在,與任何虛擬內存操作系統一樣,獲取「使用的內存」的定義也不是很好,並且定義和計算出了名的難度。

幸運的是,感謝虛擬內存管理器,您的問題可以很容易地解決:C函數mmap()。基本上,它允許你的應用程序虛擬地將文件加載到內存中,將它當作是在RAM中處理,但實際上它是在存儲器訪問時從存儲器交換的,並且當iOS的內存不足時將其交換出去。

這個功能是很容易在iOS中與可可API來使用它:

- (void) uploadMyFile:(NSString*)fileName { 
    NSData* fileData = [NSData dataWithContentsOfMappedFile:fileName]; 
    // Work with the data as with any NSData* object. The iOS kernel 
    // will take care of loading the file as needed. 
} 
+0

不會將NSData添加到POST請求需要整個文件並將其全部加載到內存中嗎?我想我基本上也在使用ALAssetRepresentation的getBytes方法來做同樣的事情。我跳到totalBytesRead並讀入chunkSize字節,然後將其粘貼在POST請求上。從我所知道的情況來看,將fileData添加到請求中會立即要求所有頁面,並且我仍然會將整個文件加載到內存中。我希望我錯了,因爲你的解決方案看起來非常簡單:) – nick 2012-03-30 19:36:00

+0

不,它不會 - 這是內存映射文件的美妙之處。對於技術細節,我推薦我鏈接到的維基百科文章。但是,我不能說它是否能解決您的具體問題,但我建議您嘗試一下。 – Krumelur 2012-03-31 19:14:53

相關問題