RDotNet内存故障

时间:2016-03-28 18:16:43

标签: c# r access-violation r.net

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

它看起来像这样:

RDotNet error 1

或者像这样:

RDotNetError 2

最常见的信息是:

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并创建新错误。

1 个答案:

答案 0 :(得分:1)

未来的googlers:

经过一番研究后,我发现错误是由不同线程访问R环境引起的。不是在同一时间,但仍然来自不同的线程(在我的情况下处理客户端请求)。

我的解决方案是为环境创建单独的单例线程,并使用外观同步对它的访问。在这个“黑客”应用程序之后不再发生错误。