该功能不在我的控制范围内,因此无法通过查看代码进行计算。它输入一个文件,并且对于不同种类的文件表现不同。而且我正在尝试预测所需的物理内存。我试图找到文件和函数的内存需求之间的关联。稍后,我将使用此信息来确定要创建的线程数,每个线程将调用此函数。
使用Process.GetCurrentProcess()和Process.PrivateMemorySize64,我可以得到调用该函数之前和之后的总内存使用之间的差异。由于没有内存泄漏,因此我将此值设为零,因此这不是我的信息。我真正需要的是学习函数执行期间使用的最大内存。
Process.PeakWorkingSet64给出自应用程序启动以来最大的总物理内存使用量。
是否可以将 PeakWorkingSet64 的值重置为零,以便获得初始值和函数的最大内存使用量之间的差值?还是有其他方法可以衡量我想要的东西?
修改
我想出了这种污垢解决方案,但似乎可行。它从不同的线程每100毫秒测量一次进程内存。任何意见 或更好的解决方案将不胜感激。
private static int _no;
private static double getCurrentMemoryInMB(System.Diagnostics.Process proc)
{
GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect();
proc.Refresh();
return proc.PrivateMemorySize64 / 1024d / 1024d;
}
private static void measureMemoryUse(Action action, string processingFileName)
{
double before = 0d, after;
bool killTask = false;
double peak = 0d;
using (System.Diagnostics.Process proc = System.Diagnostics.Process.GetCurrentProcess())
try
{
before = getCurrentMemoryInMB(proc);
System.Threading.Tasks.Task.Factory.StartNew(() =>
{
while (!killTask)
{
peak = Math.Max(peak, getCurrentMemoryInMB(proc));
System.Threading.Thread.Sleep(100);
}
});
action();
}
finally
{
killTask = true;
after = getCurrentMemoryInMB(proc);
double diff = peak - before;
var fi = new System.IO.FileInfo(processingFileName);
double fileSize = fi.Length / 1024d / 1024d;
string fileName = fi.Name;
string fnReport = @"C:\....\report.csv";
if (!File.Exists(fnReport))
{
_no = 0;
File.AppendAllLines(fnReport, new string[] { "#;before (mb);peakMem (mb);after (mb);diff (mb);fileSize (mb);diff/fileSize;fileName" });
}
File.AppendAllLines(fnReport, new string[] { string.Format("{0};{1};{2};{3};{4};{5};{6};{7}", ++_no, before, peak, after, diff, fileSize, diff / fileSize, fileName) });
}
}