9

現在、私は自分の記憶にほとんど収まらない非常に巨大なデータセットに取り組んでいるので、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_mmap11行目の最初の例では、スライス中に行列全体が読み取られるようにする場所があります。しかし、12 行目でさらに驚くべきことは、別の割り当てがあります。このような操作をさらに行うと、簡単にメモリが不足する可能性があります。

big_mmap[start:end,:]データセットのインデックスを分割すると、かなりランダムで連続的ではないため、表記法を使用できません。

私の質問は:

データ全体をメモリに読み込まずに memmap をスライスできる他の方法はありますか?

インデックスでスライスするときに行列全体がメモリに読み込まれるのはなぜですか (例 1)?

データが読み取られて再度割り当てられるのはなぜですか (最初の例の 12 行目)。

4

1 に答える 1