RDotNet 内存故障

RDotNet memory failures

在我当前的项目中,我使用的是 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" 应用程序后不再出现错误。