Произошло необработанное исключение типа "System.StackruException" в RDotNet.dll для загрузки библиотеки R в веб-приложении.

Я получаю сообщение об ошибке при загрузке библиотеки "dplyr".

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

Выше кода мне та же ошибка

"Произошло необработанное исключение типа" System.StackruException "в RDotNet.dll".

Может кто-нибудь, пожалуйста, помогите мне? Заранее спасибо...

Скриншот ошибки

2 ответа

У меня была похожая проблема с загрузкой dplyr и других библиотек R. Оказывается, проблема заключается в том, что IIS и IIS Express имеют размер стека 256 КБ в 32-разрядной системе и 512 К в 64-разрядной ОС, как упомянуто здесь. Вы можете обойти это, либо:

1) Создание потока с большим размером стека и выполнение команд R.NET внутри него. Например:

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

2) Измените размер стека по умолчанию для процесса IIS или IIS Express с помощью инструмента EditBin (поставляется с Visual Studio). Смотрите пример здесь. Однако я не рекомендую это делать, так как вы будете изменять реальный двоичный файл IIS/IIS Express.

Я решил проблему сбоя, добавив весь код R в новый поток. Он работает отлично. В режиме отладки я даже вижу, что код R оценивается правильно! Код ниже (он на VB, но его легко преобразовать в C#). Кроме того, я добавил еще немного контекста, который может помочь.

Загвоздка в том, что теперь, когда мы находимся в другом потоке, я не могу получить доступ к потоку пользовательского интерфейса. Кажется, есть отличный способ сделать это в Win Forms, используя метод Invoke пользовательского интерфейса, но веб-элементы управления, похоже, не имеют этого метода. Надеюсь, это поможет некоторым.

      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

...
Другие вопросы по тегам