因此,这与处理大对象堆并尝试最小化实例化byte []的次数有关.基本上,我有OutOfMemoryExceptions,我觉得这是因为我们实例化了太多的字节数组.当我们处理几个文件时,程序工作正常,但它需要扩展,目前它不能.
简而言之,我有一个从数据库中提取文档的循环.目前,它一次拉一个文档然后处理文档.文件的范围可以从小于1兆欧卡到400欧元不等.(因此我为什么一次处理一个).以下是伪代码,在我进行优化之前.
所以我正在做的步骤是:
调用数据库以查找最大文件大小(然后将其乘以1.1)
var maxDataSize = new BiztalkBinariesData().GetMaxFileSize();
maxDataSize = (maxDataSize != null && maxDataSize > 0)
? (long)(maxDataSize * 1.1)
: 0;
var FileToProcess = new byte[maxDataSize];
Run Code Online (Sandbox Code Playgroud)然后我进行另一个数据库调用,从数据库中提取所有文档(没有数据)并将它们放入IEnumerable中.
UnprocessedDocuments =
claimDocumentData.Select(StatusCodes.CurrentStatus.WaitingToBeProcessed);
foreach (var currentDocument in UnprocessDocuments)
{
// all of the following code goes here
}
Run Code Online (Sandbox Code Playgroud)然后我从外部源填充我的byte []数组:
FileToProcess = new BiztalkBinariesData()
.Get(currentDocument.SubmissionSetId, currentDocument.FullFileName);
Run Code Online (Sandbox Code Playgroud)这是个问题.将currentDocument(IClaimDocument)传递给其他要处理的方法会更加清晰.因此,如果我将currentDocument的数据部分设置为预格式化的数组,那么这将使用现有的引用吗?或者这会在大对象堆中创建一个新数组吗?
currentDocument.Data = FileToProcess;
Run Code Online (Sandbox Code Playgroud)在循环结束时,我会清除FileToProcess
Array.Clear(FileToProcess, 0, FileToProcess.length);
Run Code Online (Sandbox Code Playgroud)那清楚了吗?如果没有,我会尽力清理它.
和同事有分歧,而我此时并不关心谁是对的,我更好奇哪个是更好的解决方案,以便我可以继续使用它.
我们有不同的方式来访问系统.
选项#1: 使用以下代码创建数据库.
using Microsoft.Practices.EnterpriseLibrary.Data;
namespace Ivans.Healthcare.CommercialAccess.Data
{
public abstract class DataAccess : DataHelperBase
{
public const int commandTimeout = 7200;
private static Database m_db = null;
public StringBuilder Status {get; set;}
public DataAccess()
{
this.Status = new StringBuilder();
if (m_db == null)
{
bool bIfRunsOnWebService = false;
try
{
if (DynamicConfigurationManager.AppSettings["WebService"] != null)
{
bIfRunsOnWebService = true;
}
}
catch {}
if (!bIfRunsOnWebService)
{
m_db = DatabaseFactory.CreateDatabase(DataAccessResource.IDS_DB_ALIAS);
}
else
{
m_db = CreateDatabase(DataAccessResource.IDS_WS_DB_ALIAS);
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后每次需要调用存储过程时,该方法将包含如下内容:
public …Run Code Online (Sandbox Code Playgroud) 我正在开发一个项目,其中一个联合开发人员(和以前的开发人员)使用Singleton/Facade几乎每个页面的内部都有很多方法调用,但实际上并没有维护数据.
例如:
public class FooFacade
{
private static FooFacade m_facade = null;
private static DataAccessManager m_dataAccessMgr = null;
public StringBuilder Status {get; set; }
private FooFacade()
{
this.Status = new StringBuilder();
}
public static FooFacade getInstance()
{
if (m_facade == null)
{
m_dataAccessMgr = DataAccessManager.getInstance();
m_facade = new FooFacade();
}
return m_facade;
}
public void clearStatus()
{
this.Status.Remove(0, Status.Length);
}
public void Method1(string value1, int value2)
{
// DO SOMETHING
}
public List<string> Method2(string value1, int value2)
{
// DO …Run Code Online (Sandbox Code Playgroud) 这是在Visual Studio 2010中发生的.
我正在使用泛型方法,基本上失去了我的智能感知并阻止我继续这个项目的工作.
我基本上有以下课程:
public class SearchRepository : DataRepository<IAudit>
{
public override IEnumerable<IAudit> RetrieveAll<IAuditSearch>(IAuditSearch searchParameters)
{
// CODE GOES HERE
}
public override bool Delete<TIAudit>(IAudit audit)
{
// CODE GOES HERE
}
}
Run Code Online (Sandbox Code Playgroud)
这继承自:
public abstract class DataRepository<T>
{
public virtual IEnumerable<T> RetrieveAll<U>(U parameter1)
{
throw new NotImplementedException();
}
public virtual bool Delete<U>(U parameter1)
{
throw new NotImplementedException();
}
}
Run Code Online (Sandbox Code Playgroud)
所以删除工作正是我期望它工作的方式.我有intellisense,它编译正确.使用IAuditSearch,RetrieveAll无法正常工作.如果我将其更改为TIAuditSearch,那么它说我"没有合适的方法来覆盖".
不知道我做错了什么,但对我来说肯定不满意.
更新:更改虚拟以覆盖顶部的Delete方法.那是个错误.
我有一个看起来像这样的字符串:
123.45.67.890-1292通过10.98.765.432-4300连接到EDS.
我需要像这样分开它:
"123.45.67.890-1292 connected to EDS via 10.98.765.432-4300."
-----+------- --+- -+- -----+------- --+-
| | | | |
ClientIP | ServiceName HostIP |
| |
ClientSession HostSession
Run Code Online (Sandbox Code Playgroud)
我正在从具有许多复杂InStr方法的vbscript转换代码.想知道是否有办法使用regEx来做到这一点.