RDotNet 中发生 'System.StackOverflowException' 类型的未处理异常.dll以在 Web 应用程序中加载 R 库



我在加载" dplyr"库时会遇到错误的错误。

engine.Evaluate("library(dplyr)");

上方代码我相同错误

"类型'system.stackoverflowException'的未手动例外' 发生在rdotnet.dll中。

有人可以帮我吗?预先感谢...

错误的屏幕截图

我在加载 dplyr 和其他R库也有类似的问题。事实证明,IIS和II Express在32位上的堆栈大小为256K,在64位OS上的堆栈大小为512 K。您可以通过以下方式解决这个问题:

1(创建具有较大堆栈大小的线程并在其内部执行R.NET命令。例如:

Thread t = new Thread(MyMethodToDoRWork, 2500000 /*thread stack size of 2.5MB*/);

2(通过Editbin工具(随附Visual Studio(更改IIS或II Express进程的默认堆栈大小。请参阅此处的示例。我不建议这样做,但是您将修改实际的IIS/IIS Express二进制文件。

我通过将所有R代码添加到新线程中解决了崩溃问题。它运行完美。在调试模式下,我什至可以看到正确评估了R代码!下面的代码(它在VB中,但易于掩盖到C#(。另外,我还提供了一些可能会有所帮助的上下文。

捕获量是,现在我们在另一个线程中,我无法访问UI线程。似乎有一种很好的方法可以使用UI的Invoke方法在Win表单中完成此操作,但是WebControls似乎没有此方法。希望这对一些有帮助。

Public Class SPF_R
Inherits System.Web.UI.Page
Dim t As System.Threading.Thread
...
Private Sub RunRStuff()
    Dim RCode As String = ""
    Dim engine As REngine = REngine.GetInstance(Nothing, True, Nothing)
    Dim myPath As String = ViewState("Folder") & ViewState("File")
    engine.Initialize()
    engine.Evaluate("library(MASS)") : RCode &= "library(MASS)" & vbCrLf
    engine.Evaluate("library(ggplot2)") : RCode &= "library(ggplot)" & vbCrLf
    engine.Evaluate("library(broom)") : RCode &= "library(broom)" & vbCrLf
   
    ...
   
End Sub
Private Function DevelopSPF() As Boolean
    cmdSPF.Enabled = False
    t = New System.Threading.Thread(AddressOf RunRStuff, 2500000)
    t.Start()
    cmdSPF.Enabled = True
    Return True
End Function
...

相关内容

最新更新