2011-04-11 45 views
0

我有一個python代碼,它導入了由f2py(來自fortran例程)創建的dll。如果fortran中的數組太大,現在python程序崩潰。我該如何管理?通過增加堆棧大小?還是堆?我試圖研究這個問題,但我仍然不明白我如何增加堆棧,或者我應該使用堆而不是我應該怎麼做。 Python總是在我嘗試導入dll的行上崩潰,即在「import f90_routine」行。有人還提到線程,但我不知道如何使用它們。希望可以有人幫幫我!!由於堆棧大小不足導致python的dll加載錯誤?

+0

你確定這是一個堆棧溢出問題嗎?是什麼讓你認爲它是? – 2011-04-11 07:03:42

+0

請包括關於您正在使用的python版本,Fortran和C編譯器以及用於生成DLL的編譯標誌的信息。 – 2011-04-11 07:08:40

回答

0

在Visual Studio中有一個名爲EDITBIN的工具(也可能是Windows SDK),它正是您想要的。請參閱http://msdn.microsoft.com/en-us/library/xd3shwhf%28v=vs.71%29.aspx以供參考。

要檢查堆棧大小,使用

dumpbin /headers python.exe 

並查找「堆棧儲備的大小」,「可選的標頭值」下。

editbin /stack:size_in_bytes python.exe 

請注意,您將不得不將修改後的Python.exe分發給所有想要運行代碼的人。

+1

修改後的Python exe聽起來是一個相當激烈的解決方案! – 2011-04-11 10:44:13

+0

因爲pythonservice.exe(來自pywin32)使用比Python小的堆棧大小,並且我的程序在作爲Windows服務運行時崩潰,所以我不得不在客戶現場做類似的事情。當用Python中的堆棧溢出命中時,你並不總是有很多其他選項,上面的技巧對我來說是一種生命保護。請注意,最新版本的pywin32應該修復了這個問題。 – 2011-04-12 12:48:31

+0

我認爲OP的問題實際上是堆棧分配的數組實際上太大而無法放置在堆棧上。 – 2011-04-12 12:53:59

2

您的基本問題是您正在堆棧上存儲大量數據。這是糟糕的設計,可能是由於Fortran代碼的實現方式。

大型數組需要存儲在堆上並在那裏動態分配。要解決這個問題,您需要相應地理解和修改Fortran代碼。

ALLOCATE關鍵字是您如何在Fortran 90中創建堆分配的數據。但是,許多編譯器都可以選擇將數組分配到堆上,這可能是現在最適合您的路線。

相關問題