-2

我解决了 4 个月的内存异常问题。我的客户使用网络服务,他们想让我测试他们的网络服务。在他们的网络服务中,有一个函数调用上传。我在同时上传的 1500 个用户上测试了该功能。我尝试了视觉工作室(GC)的垃圾收集功能。对于 2mb 的文件,没有异常,但是对于 8mb 的文件,仍然存在内存不足的异常。我已经尝试了很多次和很多解决方案,但仍然发生。我现在要疯了。上传时,我查看了所有测试计算机的内存,但内存并没有用完。所以我认为这个问题来自网络服务和服务器。但是我的客户说我必须改进那些从网络服务和服务器到他们的原因。我现在要疯了。你们有这方面的独奏吗?此外,我们的客户不公开代码,我只是使用webservice的功能来测试。另外,当连接到 vps 时,我必须使用 vps 连接他们的 web 服务和网络相当慢。

我必须确保我的测试脚本没有任何问题。这是我测试上传功能的测试脚本。

public void UploadNewJob(string HalID, string fileUID, string jobUID, string fileName, out List errorMessages)

{

errorMessages = null;

try

{ 

int versionNumber;

int newVersionNumber;

string newRevisionTag;

datasyncservice.ErrorObject errorObj = new datasyncservice.ErrorObject();

PfgDbJob job = new PfgDbJob();

job.CompanyName = Constant.SEARCH_CN;

job.HalliburtonSalesOffice = Constant.SEARCH_SO;

job.HalliburtonOperationsLocation = Constant.SEARCH_OL;

job.UploadPersonHalId = HalID;

job.CheckOutState = Constant.CHECKOUT_STATE;

job.RevisionTag = Constant.NEW_REVISION_TAG;

var manifestItems = new List();

var newManifestItems = new List();

var manifestItem = new ManifestItem();

if (fileUID == "")

{

if (job.JobUid == Guid.Empty)

job.JobUid = Guid.NewGuid();

if (job.FileUid == Guid.Empty)

job.FileUid = Guid.NewGuid();

}

else

{

Guid JobUid = new Guid(jobUID);

job.JobUid = JobUid;

Guid fileUid = new Guid(fileUID);

job.FileUid = fileUid;

}

// Change the next line when we transfer .ssp files by parts 

manifestItem.PartUid = job.FileUid;

job.JobFileName = fileName;

manifestItem.BinaryFileName = job.JobFileName;

manifestItem.FileUid = job.FileUid;

manifestItem.JobUid = job.JobUid;

manifestItem.PartName = string.Empty;

manifestItem.SequenceNumber = 0;

manifestItems.Add(manifestItem);

errorMessages = DataSyncService.Instance.ValidateForUploadPfgDbJobToDatabase(out newVersionNumber, out newRevisionTag, out errorObj, out newManifestItems, HalID, job, false);

if (manifestItems.Count == 0)

manifestItems = newManifestItems;

if (errorMessages.Count > 0)

{

if (errorMessages.Count > 1 || errorMessages[0].IndexOf("NOT AN ERROR") == -1)

{ 

return;

}

}

//upload new Job 

Guid transferUid;


long a= GC.GetTotalMemory(false);


byte[] fileContents = File.ReadAllBytes(fileName);

fileContents = null;

GC.Collect();

long b = GC.GetTotalMemory(false);


//Assert.Fail((b - a).ToString());

//errorMessages = DataSyncService.Instance.UploadFileInAJob(out transferUid, out errorObj, job.UploadPersonHalId, job, manifestItem, fileContents);


DataSyncService.Instance.UploadPfgDbJobToDatabase(out errorObj, out versionNumber, job.UploadPersonHalId, job, false, manifestItems);

}

catch (Exception ex)

{

Assert.Fail("Error from Test Scripts: " + ex.Message);

}

}

请查看我的测试代码。如果我的测试代码没有任何问题,我必须改进原因不是我的测试代码T_T

4

1 回答 1

0

我的猜测是您达到了 .NET 的 2 GB 对象大小限制(1500 * 8MB > 4GB)。
您应该考虑更改为 .NET 4.5 并使用大对象模式 - 请参阅此处 - 该设置称为 gcAllowVeryLargeObjects。

于 2013-04-16T03:38:13.597 回答