在当前项目中,我正在使用C#和RDotNet(1.6.5)。我正在计算一些统计数据,例如卡方(使用框架),相关性和回归(图表)。
我想在我的应用程序中添加一些R图。我将绘图输出放入磁盘上的PNG文件中,然后我将其拾取并通过std读取。 IO。
一切看起来都很正常,但是有时-我无法确切说出什么时间-RDotNet崩溃,说了一些有关访问不良内存的信息。
它看起来可能像这样:
或像这样:
最常见的消息是:
Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
at RDotNet.Function.evaluateCall(IntPtr call)
at RDotNet.Function.createCallAndEvaluate(IntPtr argument)
at RDotNet.Function.InvokeNamedFast(Tuple`2[] args)
at RDotNet.REngineExtension.CreateDataFrame(REngine engine, IEnumerable[] columns, String[] columnNames, String[] rowNames, Boolean checkRows, Boolean checkNames, Boolean stringsAsFactors)
请注意,CreateDataFrame可能不是出现错误的唯一地方。一旦出现在这里,一次在调用lm函数时,一次在评估某些不同的公式时。
当前的测试场景是(简单地说):
计算A,B,A,B,A失败。我想说的是,在执行已正确评估的操作时它崩溃了。
有人可以提供一些解决方法吗?
最糟糕的是RDotNet是单例。无法简单地捕捉到错误,处置REngine并创建新错误。
最佳答案
对于未来的Google员工:
经过一些研究,我想到了错误是由从不同线程访问R环境引起的。不在同一时间,但仍来自不同的线程(在我的情况下,是处理客户端请求)。
我的解决方案是为环境创建单独的单例线程,并使用立面同步对其的访问。此“ hack”应用程序之后不再发生错误。
关于c# - RDotNet内存故障,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36268349/