1

x32 win XPでpython x32を使用しています

時々プログラムがオンラインで失敗する

fp = np.memmap('C:/memmap_test', dtype='float32', mode='w+', shape=(rows,cols))

エラーmemmap.py

Traceback (most recent call last):
    fp = np.memmap('C:/memmap_test', dtype='float32', mode='w+', shape=(rows,cols))   File "C:\Python27\lib\site-packages\numpy\core\memmap.py", line 253, in __new__
    mm = mmap.mmap(fid.fileno(), bytes, access=acc, offset=start)
OverflowError: cannot fit 'long' into an index-sized integer

配列のサイズに制限があると思いますので、配列の最大サイズ maxN = rows*cols はどれくらいですか?

また、1. python x32 win x64 および 2. python x64 win x64 についても同じ質問です。

アップデート:

#create array
rows= 250000
cols= 1000
fA= np.memmap('A.npy', dtype='float32', mode='w+', shape=(rows,cols))
# fA1= np.memmap('A1.npy', dtype='float32', mode='w+', shape=(rows,cols)) # can't create another one big memmap
print fA.nbytes/1024/1024 # 953 mb

したがって、単一のメモリマップされた配列の場合、<2Gb だけでなく、別の制限があるようです。

@Paul が提供するテスト用の出力も

working with 30000000 elements
number bytes required 0.240000 GB
works
working with 300000000 elements
number bytes required 2.400000 GB
OverflowError("cannot fit 'long' into an index-sized integer",)
working with 3000000000 elements
number bytes required 24.000000 GB
IOError(28, 'No space left on device')
working with 30000000000 elements
number bytes required 240.000000 GB
IOError(28, 'No space left on device')
working with 300000000000 elements
number bytes required 2400.000000 GB
IOError(28, 'No space left on device')
working with 3000000000000 elements
number bytes required 24000.000000 GB
IOError(22, 'Invalid argument')
4

1 に答える 1

2

このトピックに関する議論を次に示します。 Python の mmap が大きなファイルで機能しないのはなぜですか?

以下のテストでは、次のコードを使用しています。

baseNumber = 3000000L

for powers in arange(1,7):
  l1 = baseNumber*10**powers
  print('working with %d elements'%(l1))
  print('number bytes required %f GB'%(l1*8/1e9))
  try:
    fp = numpy.memmap('test.map',dtype='float64', mode='w+',shape=(1,l1))
    #works 
    print('works')
    del fp
  except Exception as e:
    print(repr(e))

Windows x32 上の python x32 32 ビット Windows では、ファイル サイズは約 2 ~ 3GB に制限されます。そのため、OS の制限により、このファイル サイズより大きなウィンドウは作成できません。x32 ビット マシンにアクセスできませんでしたが、ファイル サイズの制限に達するとコマンドが失敗します

Windows x64 上の Python x32

この場合、python は 32 ビットであるため、win64 で許可されているファイル サイズに到達できないようです。

%run -i scratch.py

python x32 win x64
working with 30000000 elements
number bytes required 0.240000 GB
works
working with 300000000 elements
number bytes required 2.400000 GB
OverflowError("cannot fit 'long' into an index-sized integer",)
working with 3000000000 elements
number bytes required 24.000000 GB
OverflowError("cannot fit 'long' into an index-sized integer",)
working with 30000000000 elements
number bytes required 240.000000 GB
IOError(28, 'No space left on device')
working with 300000000000 elements
number bytes required 2400.000000 GB
IOError(28, 'No space left on device')
working with 3000000000000 elements
number bytes required 24000.000000 GB
IOError(22, 'Invalid argument')

Windows x64 上の Python x64

この場合、最初はディスク サイズによって制限されますが、配列/バイト サイズが十分に大きくなると、何らかのオーバーフローが発生するように見えます

%run -i scratch.py
working with 30000000 elements
number bytes required 0.240000 GB
works
working with 300000000 elements
number bytes required 2.400000 GB
works
working with 3000000000 elements
number bytes required 24.000000 GB
works
working with 30000000000 elements
number bytes required 240.000000 GB
IOError(28, 'No space left on device')
working with 300000000000 elements
number bytes required 2400.000000 GB
IOError(28, 'No space left on device')
working with 3000000000000 elements
number bytes required 24000.000000 GB
IOError(22, 'Invalid argument')

要約すると、アレイが失敗する正確なポイントは、Windows x64 の最初のディスク サイズによって異なります。

pythonx32 windows x64 最初はタイプ エラーが発生し、次にディスク サイズの制限が発生しましたが、ある時点で無効な引数エラーが発生します。

pythonx64 windows x64 最初はディスク サイズの制限がありますが、ある時点で他のエラーが発生します。興味深いことに、これらのエラーは3000000000000*8 < 2 64 として
2 64 サイズの問題に関連して表示されません。

ディスクが十分に大きければ、無効な引数エラーが表示されず、これをテストするのに十分な大きさのディスクがありませんでしたが、2 ** 64 の制限に達する可能性があります:)

于 2013-10-23T12:30:17.397 に答える