現在、私は自分の記憶にほとんど収まらない非常に巨大なデータセットに取り組んでいるので、np.memmap
. しかし、ある時点で、データセットをトレーニングとテストに分割する必要があります。いくつかのインデックス配列を使用してスライスしたい場合に、そのようなケースを見つけましたnp.memmap
: (以下にコードとメモリの割り当てがあります)
Line # Mem usage Increment Line Contents
================================================
7 29.340 MB 0.000 MB def my_func2():
8 29.340 MB 0.000 MB ARR_SIZE = (1221508/4,430)
9 29.379 MB 0.039 MB big_mmap = np.memmap('big_mem_test.mmap',shape=ARR_SIZE, dtype=np.float64, mode='r')
10 38.836 MB 9.457 MB idx = range(ARR_SIZE[0])
11 2042.605 MB 2003.770 MB sub = big_mmap[idx,:]
12 3046.766 MB 1004.160 MB sub2 = big_mmap[idx,:]
13 3046.766 MB 0.000 MB return type(sub)
しかし、連続スライスを取りたい場合は、むしろ次のコードを使用します。
Line # Mem usage Increment Line Contents
================================================
15 29.336 MB 0.000 MB def my_func3():
16 29.336 MB 0.000 MB ARR_SIZE = (1221508/4,430)
17 29.375 MB 0.039 MB big_mmap = np.memmap('big_mem_test.mmap',shape=ARR_SIZE, dtype=np.float64, mode='r')
18 29.457 MB 0.082 MB sub = big_mmap[0:1221508/4,:]
19 29.457 MB 0.000 MB sub2 = big_mmap[0:1221508/4,:]
行 18、19 の 2 番目の例では、メモリ割り当てがなく、操作全体がはるかに高速であることに注意してください。
big_mmap
11行目の最初の例では、スライス中に行列全体が読み取られるようにする場所があります。しかし、12 行目でさらに驚くべきことは、別の割り当てがあります。このような操作をさらに行うと、簡単にメモリが不足する可能性があります。
big_mmap[start:end,:]
データセットのインデックスを分割すると、かなりランダムで連続的ではないため、表記法を使用できません。
私の質問は:
データ全体をメモリに読み込まずに memmap をスライスできる他の方法はありますか?
インデックスでスライスするときに行列全体がメモリに読み込まれるのはなぜですか (例 1)?
データが読み取られて再度割り当てられるのはなぜですか (最初の例の 12 行目)。