在我目前的项目中,我正在使用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并创建新错误。
答案 0 :(得分:1)
未来的googlers:
经过一番研究后,我发现错误是由不同线程访问R环境引起的。不是在同一时间,但仍然来自不同的线程(在我的情况下处理客户端请求)。
我的解决方案是为环境创建单独的单例线程,并使用外观同步对它的访问。在这个“黑客”应用程序之后不再发生错误。