Numpy: Ubuntu 16.04でfromfileを使用してファイルのサイズを超えて読み取ると、データとセグメンテーション違反が無効になります

作成日 2018年10月31日  ·  4コメント  ·  ソース: numpy/numpy


fromfile無効なデータであり、ファイルの終わりを超えて読み取る場合はセグメンテーション違反が発生する場合があります。つまり、読み取りがファイルの終わりを超えるかどうかはチェックされません。 この問題により、Ubuntu 16.04ではセグメンテーション違反が発生しますが、OSXではセグメンテーション違反ではないようです。

コード例の再現:

import numpy as np

def test_read_from_file():
    # create an empty file named `empty.bin`
    filename = 'empty.bin'
    open(filename, 'a').close()

    # read large chunk of data, past the end of the file
    dtype = [('data', '<f4', 500,)]
    count = 100000000

    with open(filename, 'rb') as fh:
        data = np.fromfile(fh, dtype, count)

    print(data.shape)

エラーメッセージ:


プロセスは終了コード139で終了しました(シグナル11:SIGSEGVによって中断されました)

Numpy / Pythonのバージョン情報:

プラットフォームlinux-Python3.6.6、pytest-3.8.2、py-1.6.0、pluggy-0.7.1

00 - Bug numpy.core

最も参考になるコメント

ここでの問題は、実際にはubuntuでMemoryErrorが誤って処理され、セグメンテーション違反が発生していることだと思います。

修正されたPRはここにあります: https

全てのコメント4件

ちなみに、1.15.3で再現可能です。 サイズはわかっていると思うので、エラーが発生するか、ファイル全体を読み取る必要があります。 これが一部のシステムでサイレントに機能する場合は、万が一の場合に備えてリリースノートを作成する必要があります(それでも修正できると思います)。

編集:私はエラーを起こす傾向があります。インデックス付けのためにファイル全体がオプションである可能性があると思っただけですが、インデックス付けはこの点で少し特別です。

同意しました。エラーを発生させるのは良い考えのように思えます。 部分的な読み取りについては、まだ2つの方法で処理できます。

  1. ファイルの終わりまたはcountfromfileまで、できるだけ多くのデータレコードを読み取りますが、実際に読み取られたレコードの数を明示的に返すメカニズムが必要です(暗黙的に)これは、結果の配列の形で表示されるはずです)。 通常の使用シナリオではないため、エラーが発生する可能性があります。
  2. 部分的な読み取りを許可しないでください。つまり、読み取るサイズがファイルの残りの部分に収まらない場合はレイズします。

どのシナリオがNumpyの哲学に適しているかはわかりませんが、最初のオプションの方が便利に聞こえます。

エラーが最も合理的だと思います。 私が今確信していないのは、fromfileが既知のサイズを持たないオブジェクトのようなファイルをサポートしているかどうか、または空でないsepkwargの場合に現在何が起こっているかです。

@amuresan fromfileのコードはCですが、少し時間があれば、プルリクエストには常に満足しており、C(Python)APIに少し手を加えるのはかなり難しいようです。

ここでの問題は、実際にはubuntuでMemoryErrorが誤って処理され、セグメンテーション違反が発生していることだと思います。

修正されたPRはここにあります: https

このページは役に立ちましたか?
0 / 5 - 0 評価