簡體   English   中英

Malloc 內存問題

[英]Malloc Memory Questions

首先,我注意到當我 malloc 內存與 calloc 內存占用是不同的。 我正在處理幾 GB 的數據集。 這個數據是隨機的是可以的。

我希望我可以只分配大量內存並讀取其中的任何隨機數據轉換為浮點數。 但是,查看進程查看器中的內存占用情況,顯然沒有占用內存(與我看到大量占用空間的 calloc 相比)。 我運行了一個循環將數據寫入內存,然后我看到內存占用量攀升。 我說內存在我初始化之前實際上並沒有被占用是否正確?

最后,在我通過 1024*1024*128 字節(進程查看器中為 1024 MB)之后,我開始出現段錯誤。 然而,Calloc 似乎將全部初始化為 1 GB。 為什么在使用 malloc 的 for 循環中初始化內存時出現段錯誤,這個數字為 128MB,為什么內存占用顯示為 1024MB?

如果 malloc 大量內存然后從中讀取我得到了什么(因為進程查看器在我初始化之前幾乎沒有顯示任何占用空間)?

最后有什么辦法可以讓我分配超過 4GB 的空間嗎? 我正在測試內存層次結構性能。

#2 的代碼:

    long long int i;
    long long int *test=(long long int*)malloc(1024*1024*1024);
    for (i=0;i<1024*1024*128;i++)
            test[i]=i;

    sleep(15);

一些注意事項:

  1. 正如評論所指出的,Linux 在您使用它之前實際上不會分配您的內存。
  2. 當您使用 calloc 而不是 malloc 時,它會將您請求的所有內存清零。 這相當於使用它。

1- 如果您在 32 位機器上工作,則分配給它的變量不能超過 2GB。

2- 如果您在 64 位機器上工作,您總共可以分配與 RAM+Swap 內存一樣多的內存,但是,為一個變量分配所有內存需要大量的后續內存塊,而這些內存塊可能不可用。 嘗試使用鏈表,其中每個元素僅分配 1 MB 空間,並且您可以獲得更高的內存分配總量。

3- 正如您和 Sharth 所指出的,除非您使用內存,否則 linux 不會分配它。

由於sizeof(long long int) > 8或因為您的 malloc 返回 NULL,您的 #2 因段錯誤而失敗。 如果您請求 1 GB 的 RAM,這是很有可能的。

有關 #2 的更多信息。 從您 128 MB 的評論中,我了解到您可能沒有意識到發生了什么。 因為您將數組指針聲明為long long int所以每個數組元素的大小為 8 個字節。 1024/8 == 128 所以這就是你的循環起作用的原因。 無論如何,當我嘗試它時確實如此。

您的示例代碼中的for循環實際上涉及 1GB 內存,因為它正在索引 128*1024*1024 long long s,並且每個long long是 8 個字節。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM