0
私は非常に大きなルックアップテーブルをC++で生成しており、さまざまなC++関数から使用しています。これらの関数は、boost :: pythonを使ってPythonに公開されています。boost :: pythonを使ったC++関数からの大規模なテーブルアクセス
クラスの一部として使用されない場合、望ましい動作が達成されます。 Pythonで書かれたクラスの一部として関数を使用しようとすると、ルックアップテーブルへのアクセスに関する問題が発生します。
------------------------------------
C++ for some numerical heavy lifting
------------------------------------
include <boost/python>
short really_big_array[133784630]
void fill_the_array(){
//Do some things which populate the array
}
int use_the_array(std::string thing){
//Lookup a few million things in the array depending on thing
//Return some int dependent on the values found
}
BOOST_PYTHON_MODULE(bigarray){
def("use_the_array", use_the_array)
def("fill_the_array", fill_the_array)
}
---------
PYTHON Working as desired
---------
import bigarray
if __name__ == "__main__"
bigarray.fill_the_array()
bigarray.use_the_array("Some Way")
bigarray.use_the_array("Some Other way")
#All works fine
---------
PYTHON Not working as desired
---------
import bigarray
class BigArrayThingDoer():
"""Class to do stuff which uses the big array,
use_the_array() in a few different ways
"""
def __init__(self,other_stuff):
bigarray.fill_the_array()
self.other_stuff = other_stuff
def use_one_way(thing):
return bigarray.use_the_array(thing)
if __name__ == "__main__"
big_array_thing_doer = BigArrayThingDoer()
big_array_thing_doer.use_one_way(thing)
#Segfaults or random data
私はおそらくわから配列は、適切なタイミングでアクセス可能ですが、私はさらすことshoudld正確に何イムかなり確実ではない作るためのpythonに十分にさらすわけではないと思います。同じように、ルックアップテーブルの所有権に関わる問題があります。
他のC++関数以外でルックアップテーブルを操作する必要はありません。
変数 'really_big_array'がグローバルスコープで宣言されている場合、* all * [翻訳単位*](https://en.wikipedia.org/wiki/Translation_unit_(プログラミング))にアクセスできます。正しい宣言をしてください。 –
'use_one_way'は' self'パラメータをとりません。これは私に「私の実際のコードではない」と言っているところであり、私たちはあなたが私たちが答えを根底から期待しているのかと思っています。 – kfsone
@kfsoneほぼ、これは私の言うところによると、「私の実際のコードではないが、実際のコードは同じ問題を共有している」と私は実際にはばかだ。おそらく私はそれが以前のことが他の何かが壊れたときに私はそれが非難されたと思って立ち往生したときに望んでいたように働いているように働くことに追いついた。私がしなかったときの明白な点を付けてくれてありがとう。私がちょうど何かばかげたことを心配してくれたことに感謝します。 – TobyD