在当前项目中,我正在使用C#和RDotNet(1.6.5)。我正在计算一些统计数据,例如卡方(使用框架),相关性和回归(图表)。
我想在我的应用程序中添加一些R图。我将绘图输出放入磁盘上的PNG文件中,然后我将其拾取并通过std读取。 IO。
一切看起来都很正常,但是有时-我无法确切说出什么时间-RDotNet崩溃,说了一些有关访问不良内存的信息。

它看起来可能像这样:

c# - RDotNet内存故障-LMLPHP

或像这样:

c# - RDotNet内存故障-LMLPHP

最常见的消息是:

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/

10-09 18:51