0

Python で記述したコードの一部は、C で高速に実行できることがわかりました。これには scipy.weave.inline を使用しました。C コードに渡す必要のある整数の 1 つである seek_pos は、(時々) 32 ビット長で表現できるものよりも大きくなりました。seek_pos を計算して正しい値 (おそらく 23 億) を取得できますが、それを fseek や fseeko64 のオフセットとして使用するなど、他のことを行うと、-19 億 (または任意の値) であるかのように動作します。 d は、正の long int の範囲を超えて、負の long int に回り込むことから取得します)。

私の回避策は、Python y=seek_pos/N, x=seek_pos%N で大きな整数を分解し、それらの小さい数値を渡し、C で大きい数値を再構築することでした、seek_pos_off = Y*N+X. 私は Weave と C/C++ の両方に不慣れです。私のコードは今では動作しますが、これはかなりばかげた方法だと思います。weave.inline の既製の型コンバーターを指定するか、カスタムの型コンバーターを作成することもできたかもしれませんが、どうすればよいでしょうか。これは私には明確ではありませんでした。

誰かがこれを行うためのより良い方法を提案できるなら、私はそれを感謝しますが、そうでない場合でも、同じ問題を扱っている誰かが検索時に少なくとも私の仕事を見つけることができるように、とにかくこれを投稿したかった.

ここに私のコードの関連部分があります

vtrace = numpy.zeros(len_trace, dtype='short')
c_code = '''
using namespace std;
const char * cc_fpath = filepath.c_str();
FILE * infile;
infile = fopen(cc_fpath, "r");
long seek_pos_off;
long long_multiplier;
long_multiplier = seek_pos_multiplier;
long long_adder;
long_adder = seek_pos_adder;
seek_pos_off = long_multiplier * 2000000000 + long_adder;
fseek(infile, seek_pos_off, SEEK_SET);
for (int n=0; n<len_trace; n++) {
    fread(vtrace+n, data_bytes_per_channel, 1, infile);
    fseek(infile, skip_bytes, SEEK_CUR);
}
fclose(infile);

return_val = 0;
'''
filepath = str(filepath)
seek_pos = int(data_start_pos_in_bytes + start_byte)
seek_pos_multiplier = seek_pos/2000000000
seek_pos_adder = seek_pos%2000000000
weave.inline(c_code, ['vtrace', 'filepath', 'seek_pos_multiplier', 
        'seek_pos_adder', 'len_trace', 'data_bytes_per_channel', 
        'skip_bytes'], headers=['<typeinfo>'])
4

1 に答える 1

0

やってみました

seek_pos = long(data_start_pos_in_bytes + start_byte)

それ以外の

seek_pos = int(data_start_pos_in_bytes + start_byte)

それかもしれません。

于 2012-09-28T17:10:30.377 に答える