这是我的代码:
int size = 100000000;
double sizeInMegabytes = (size * 8.0) / 1024.0 / 1024.0; //762 mb
double[] randomNumbers = new double[size];
Run Code Online (Sandbox Code Playgroud)
例外:抛出了类型'System.OutOfMemoryException'的异常.
我在这台机器上有4GB内存当我开始运行时,2.5GB是免费的,PC上有足够的空间来处理762mb的100000000随机数.我需要在给定可用内存的情况下尽可能多地存储随机数.当我去生产时,盒子上将有12GB,我想要使用它.
CLR是否将我限制为默认的最大内存?以及如何申请更多?
更新
我认为将其分解为更小的块并逐渐增加我的内存需求将有助于如果问题是由于内存碎片,但它不会无法超过256mb的总ArrayList大小,无论我做什么调整blockSize.
private static IRandomGenerator rnd = new MersenneTwister();
private static IDistribution dist = new DiscreteNormalDistribution(1048576);
private static List<double> ndRandomNumbers = new List<double>();
private static void AddNDRandomNumbers(int numberOfRandomNumbers) {
for (int i = 0; i < numberOfRandomNumbers; i++) {
ndRandomNumbers.Add(dist.ICDF(rnd.nextUniform()));
}
}
Run Code Online (Sandbox Code Playgroud)
从我的主要方法:
int blockSize = 1000000;
while …Run Code Online (Sandbox Code Playgroud) 我有一个公共程序集/项目,它有一个抽象基类,然后是几个我想公开给其他程序集的派生类.
我不希望抽象基类出现在Intellisense中的这些其他程序集中,所以我想我会成功internal,但是我得到了这个错误:
可访问性不一致:基类"设置"比"IrcSettings"类更难访问....
我真的不明白.我被迫制作抽象Settings类public,因此在这个程序集之外可见.
我怎样才能成为这门课internal呢?
我有一个简单的类XmlFileHelper如下:
public class XmlFileHelper
{
#region Private Members
private XmlDocument xmlDoc = new XmlDocument();
private string xmlFilePath;
#endregion
#region Constructor
public XmlFileHelper(string xmlFilePath)
{
this.xmlFilePath = xmlFilePath;
xmlDoc.Load(xmlFilePath);
}
#endregion
#region Public Methods
public XmlNode SelectSingleNode(string xPathQuery)
{
return xmlDoc.SelectSingleNode(xPathQuery);
}
public string GetAttributeValueByName(XmlNode node, string attributeName)
{
return node.Attributes.GetNamedItem(attributeName).Value;
}
#endregion
#region Public Properties
public string XmlFilePath
{
get
{
return xmlFilePath;
}
}
#endregion
}
Run Code Online (Sandbox Code Playgroud)
问题是我在加载时收到以下错误:
System.IO.IOException: The process cannot access the file ''C:\CvarUAT\ReportWriterSettings.xml'' **because it is being …Run Code Online (Sandbox Code Playgroud) 我正在使用c#.net 2(Visual Studio 2005 SP1)尝试使用来自Oracle10g数据库的select*from table的结果填充数据集.无法在此客户端站点更改.net框架,IDE和数据库.
我正在使用ODP.net提供程序连接,dll版本是2.102.2.20
当我运行fill命令时,我得到一个例外:
算术运算导致溢出
此外,如果我尝试查看Visual Studio设计器中的违规列(显示表数据),我得到 对于表中此列的每一行.如果我的查询选择其他具有整数的列(例如省略此列),则代码可以正常工作.
当我从Toad在数据库中查看时,相关列看起来很好,数据如下所示:
919.742866695572
我需要蒙特卡罗模拟所需的精度.
如果不是使用数据适配器来填充数据表我使用datareader并调用dataReader.getValue(columnIndex)我得到相同的错误但是如果我调用dataReader.GetOracleDecimal(columnIndex)然后我得到我正在寻找的结果,没有错误.
我宁愿使用数据适配器并填充数据集(注意这些是无类型数据集,因为我无法从oracle db中获得自动生成的强类型数据集).我不想使用datareader并遍历结果(选择列值),因为我试图将其作为通用方法编写,以适用于许多场景,无论列数,需要特定的十进制列索引通过数据类型获取调用.
有人可以帮忙吗?我可以使用新版本的ODP.net dll连接到较旧的Oracle10g数据库吗?我想知道这是否会有所帮助.
谢谢
我想做的事情如下:
object[] rowOfObjects = GetRow();//filled somewhere else
object[,] tableOfObjects = new object[10,10];
tableOfObjects[0] = rowOfObjects;
Run Code Online (Sandbox Code Playgroud)
这有点可能,语法是什么?
或者我需要这样做:
for (int i = 0; i < rowOfObjects.Length; i++)
{
tableOfObjects[0,i] = rowOfObjects[i];
}
Run Code Online (Sandbox Code Playgroud)
并使用循环填充二维数组行?
谢谢
如何在MSI安装程序中包含pdb文件以与应用程序的其余部分一起部署?
我想在我们生成的错误日志中保留行号和完整堆栈跟踪.
更新
除非你分发pdb,否则代码的行号不会在堆栈跟踪中报告,我已对此进行了测试.
如何构建MSI并且我已经要求MSI安装程序项目包含各种项目输出(大约5个)以包含MSI中那些项目输出的pdb?或者如何从Exception ex获取此信息(代码行号)到日志中?
我目前使用带有RollingFileAppender的log4net.
在进行每次Log调用时,我想将其存储在内存中.在我的控制台应用程序运行结束时,我想(如果app.config设置为true)只接受警告和致命并在电子邮件中发送所有这些消息.我注意到MemoryAppender但不太确定如何使用它.另请参阅SMTPAppender但不确定它是否是正确的工具,否则我将使用MemoryAppender并以某种方式过滤掉Levels Warn/Fatal的事件,然后使用SmtpClient类发送电子邮件.
怎么做到这一点?
谢谢
更新
我的log4net配置的最后一部分现在看起来像.
<appender name="MemoryAppender" type="log4net.Appender.MemoryAppender" >
<onlyFixPartialEventData value="true" />
<threshold value="WARN" />
</appender>
<root>
<level value="DEBUG" />
<appender-ref ref="Console" />
<appender-ref ref="RollingFile" />
<appender-ref ref="MemoryAppender" />
</root>
Run Code Online (Sandbox Code Playgroud)
在代码我做:
private static MemoryAppender MemoryAppender
{
get
{
if (memoryAppender == null)
{
Hierarchy h = LogManager.GetRepository() as Hierarchy;
memoryAppender = h.Root.GetAppender("MemoryAppender") as MemoryAppender;
}
return memoryAppender;
}
}
Run Code Online (Sandbox Code Playgroud)
然后当我想要我称之为的事件时:
MemoryAppender.GetEvents();
我已经尝试了MemoryAppender.GetEvents()[0] .RenderedMessage,但这不是正确的输出,如何获取消息字符串,因为它使用正确的模式和时间等写入文件/控制台日志并构建自己StringBuilder的?然后我将它放在我的电子邮件正文中并使用SmtpClient发送它.RenderMessage只是给我提供给Log.Warn()调用的字符串,而不是写入日志的字符串.这是因为没有在MemoryAppender上设置布局模式吗?
谢谢
我目前的任务是优化蒙特卡罗模拟,该模拟根据一组Obligors计算资本充足率数据.
它运行大约10倍太慢,无法生产,需要数量或每日运行.此外,结果数字的粒度需要在某个阶段提升到桌面可能的书本水平,我给出的代码基本上是一个原型,由半生产能力的业务部门使用.
该应用程序目前是单线程的,所以我需要使它多线程,可能看看System.Threading.ThreadPool或Microsoft Parallel Extensions库但我在这家银行的服务器上受限于.NET 2所以我可能不得不考虑这个人的端口,http://www.codeproject.com/KB/cs/aforge_parallel.aspx.
我正在尽力让他们升级到.NET 3.5 SP1,但这是在这种规模的组织中的一项重要练习,在合同时间框架内可能无法实现.
我使用dotTrace的试用版(http://www.jetbrains.com/profiler)描述了该应用程序.还有哪些好的剖析器?免费的?
大量的执行时间用于生成均匀的随机数,然后将其转换为正态分布的随机数.他们正在使用C#Mersenne twister实现.我不确定他们在哪里获得它,或者它是最好的方法来实现这个(或最佳实现)来生成统一的随机数.然后将其转换为正态分布版本以供计算使用(我还没有深入研究过翻译代码).
使用以下内容的经验是什么?
http://www.qlnet.org(Quantlib的C#端口)或
您知道的任何替代方案?我是C#开发人员,所以更喜欢C#,但C++的包装应该不是问题,是吗?
也许更快地利用C++实现.我认为这些库中的一些库将具有最快的方法来直接生成正态分布的随机数,而无需转换步骤.此外,他们可能还有一些其他功能,将有助于后续计算.
此外,它所使用的计算机是四核Opteron 275,8 GB内存,但Windows Server 2003 Enterprise 32位.我应该建议他们升级到64位操作系统吗?任何支持这一决定的文章的链接都将非常感激.
无论如何,任何建议和帮助你都非常感激.
我的任务是采用现有的单螺纹蒙特卡罗模拟并对其进行优化.这是ac#console app,没有db访问它从csv文件加载一次数据并在最后写出来,所以它几乎只是CPU绑定,也只使用大约50mb的内存.
我通过Jetbrains dotTrace探测器运行它.在总执行时间中,大约30%生成均匀随机数,24%将均匀随机数转换为正态分布随机数.
基本算法是一大堆嵌套for循环,在中心有随机数调用和矩阵乘法,每次迭代返回一个加到结果列表中的double,这个列表定期排序并测试一些收敛标准(检查时)如果可以接受的话,程序会从循环中断开并写入结果,否则它会继续到最后.
我希望开发人员能够权衡:
由于我从未编写任何并行或多线程代码,因此欢迎使用上述教程的一些链接.
当前应用程序需要2个小时进行500,000次迭代,业务需要将其扩展到3,000,000次迭代,并且每天被称为多次,因此需要进行一些繁重的优化.
特别想听听使用Microsoft Parallels Extension或AForge.Net Parallel的人的意见
这需要相当快productionised所以.NET 4测试版出来,即使我知道它已经并发库烤,我们可以看看迁移到.NET 4后沿着轨道一旦它的发布.目前服务器有.Net 2,我已提交审核升级到我的开发箱所具有的.net 3.5 SP1.
谢谢
更新
我刚刚尝试了Parallel.For实现,但它提出了一些奇怪的结果.单线程:
IRandomGenerator rnd = new MersenneTwister();
IDistribution dist = new DiscreteNormalDistribution(discreteNormalDistributionSize);
List<double> results = new List<double>();
for (int i = …Run Code Online (Sandbox Code Playgroud) 到目前为止,我一直在使用此处的C#Mersenne Twister生成随机数:
http://www.centerspace.net/resources.php
我刚发现SFMT的速度应该是这里的两倍:
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/SFMT/
有人能指出我在SFMT的C#实现吗?
我的要求是在(和包括)0和2 ^ 20(1048576)之间生成一个整数.
我需要每天花费数万亿次进行24小时制模拟,所以我准备好花几天时间来完善它.
目前我通过添加一种符合我要求的新方法调整了Center Space Mersenne Twister:
public uint Next20()
{
return (uint)(genrand_int32() >> 12);
}
Run Code Online (Sandbox Code Playgroud)
使用genrand_int32()我想生成我自己的版本的方法genrand_int20(),它生成一个介于(和包括)0和2 ^ 20之间的整数,以保存上面的转换和转移,但我不理解数学.究竟我该怎么做?
也正在使用uint比int更快,或者只是可寻址数字的问题?因为我只需要1048576,我只关心速度.
此外,它将在带有.NET 2的Windows Server 2003 R2 SP2(32位)盒上运行.处理器是AMD Opteron 275(4核).
c# ×10
montecarlo ×2
random ×2
arrays ×1
datatable ×1
inheritance ×1
load ×1
locking ×1
log4net ×1
odp.net ×1
oracle ×1
oracle10g ×1
pdb-files ×1
threadpool ×1
xml ×1