2014-08-19 2 views
0

매우 깊은 스택으로 일부 F # 코드를 실행해야합니다. Mono 철학은 꼬리 끌기 제거가 최적화이므로 항상 작동 할 필요는 없기 때문입니다.PSeq 스레드 (또는 System.Linq.ParallelEnumerable에서 사용하는 스택 깊이)의 스택 깊이

많은 양의 스택 스페이스가있는 스레드를 시작할 수 있으며 System.Linq.ParallelEnumerable 주위의 래퍼 인 PSeq를 사용할 때까지 모든 것이 올바르게 작동합니다. 스택 오버플로가 발생하면 모든 것이 사라집니다. 이유는 PSeq이 스레드가 기본 스택 크기를 사용하는 전역 스레드 풀에 의존한다는 것입니다.

누군가 PSeq에서 대형 스택을 사용하는 방법이 있는지 말해 줄 수 있습니까? 많은 감사합니다.

+0

을 (http://msdn.microsoft.com/en-us/library/system.threading.tasks.taskscheduler.aspx) PLINQ에서 사용하는 [하지 않습니다 가능할 것 같습니다.] (http://stackoverflow.com/a/5197603/1180426) –

답변

0

분명히 editbin을 사용하여 실행 파일의 기본 스택 크기를 변경할 수 있습니다. How to change stack size for a .NET program?을 참조하십시오.

그러나 많은 F # tail 호출은 컴파일러에 의해 다시 작성되므로 런타임이 무엇인지는 중요하지 않습니다. 예를 들어 F #의 함수는 다음과 같습니다.

let rec zeroPresent = 
    function 
    | [] -> false 
    | h :: t -> h = 0 || zeroPresent t 

그리고 여기서는 C#으로 디 컴파일됩니다. while (true) 참고 : [`TaskScheduler`]를 변경하면

public static bool zeroPresent(FSharpList<int> _arg1) 
{ 
    while (true) 
    { 
     FSharpList<int> fsharpList1 = _arg1; 
     if (fsharpList1.get_TailOrNull() != null) 
     { 
      FSharpList<int> fsharpList2 = fsharpList1; 

      FSharpList<int> tailOrNull = fsharpList2.get_TailOrNull(); 

      if (fsharpList2.get_HeadOrDefault() != 0) 
       _arg1 = tailOrNull; 
      else 
       goto label_3; 
     } 
     else 
      break; 
    } 
    return false; 
label_3: 
    return true; 
} 
+0

답변에 대한 많은 감사드립니다. Mono/Linux에서 실행 중입니다. editbin은 Windows 유틸리티 인 것으로 보이며 Google은 Linux와 동일한 기능을 제공하지 않습니다. Windows에서 파일을 편집하면 다음에 클린 트리를 만드는 데 도움이되는지 알 수 있습니다. –