2010-10-28 46 views
2

我有一個轉換文件的程序。它需要一個輸入文件名和一個輸出文件名,從一個文件讀取並寫入另一個文件,並進行一些修改。我有來源,但它很龐大,我沒有清楚的操作畫面。我可以說文件是以讀寫模式(_O_RDWR)使用_wsopen_s打開的,在開放時似乎沒有任何有趣的事情發生。Win32文件耗盡系統內存的I/O

出於某種原因,當我嘗試在某個大型輸入文件中使用此程序時,會發生以下情況。首先,物理內存使用率和用於文件系統高速緩存(由任務管理器報告)的內存量增加。看起來,對於每個字節的讀取和字節寫入,內存使用量增加2個字節。請注意,這是由操作系統擁有的內存:提交大小和實際可執行文件的工作集大小保持不變。

然後,當文件系統高速緩存大小接近總可用內存時,操作系統開始將正在運行的程序交換到頁面文件中,最終系統變得無響應。

該程序的作者說,他們沒有看到這種類型的行爲,他們不知道爲什麼會發生這種情況。

在我正式提出這是一個錯誤,並試圖讓他們來修復它(這可能需要很長的時間,我需要的程序現在的工作):

  • 有沒有在源代碼中的任何我可以尋找,某種潛行的函數調用,可能會觸發這種類型的行爲?
  • 我可以告訴操作系統不要這樣做嗎?
  • 而且,更普遍的是什麼?

這發生在x64 Vista Home Premium SP2上。

+0

有一個與W2k8相似的已知問題。你嘗試過Google嗎?並確定它不泄漏手柄? – ruslik 2010-10-28 04:34:15

+0

它不會泄漏手柄。谷歌沒有幫助。 – user434507 2010-10-28 04:58:03

+0

我正在投票結束這項工作,因爲這不是一個編程問題,而是程序編寫者的客戶支持問題。如果程序是打包軟件並且不起作用,他們應該修復它,或者退還您的資金。 – 2010-10-28 13:35:43

回答

0

如果程序使用的內存與您的輸入文件直接成正比,那麼它看起來像程序試圖一次讀入所有內存緩衝區。

改進它的一個典型方法是讀入一個緩衝區,限制在200kb或更大,並進行處理,並將轉換後的數據寫出,並附加到輸出文件中。這樣,它不會耗盡系統內存。

+0

系統文件緩存不受讀取大小的影響。在沒有使用RAM之前,爲什麼不使用它?然而,奇怪爲什麼緩存優先於正在運行的程序。 – ruslik 2010-10-28 04:32:12

+0

程序本身不使用內存,操作系統呢! – user434507 2010-10-28 04:58:43