2

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

它看起来像这样:

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

4

1 回答 1

2

对于未来的谷歌人:

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

我的解决方案是为环境创建单独的单例线程并使用外观同步对它的访问。此“hack”应用程序后不再出现错误。

于 2016-04-22T19:30:04.347 回答