2016-08-22 3 views
3

私の(おそらく64ビットWindows、64ビット2.7 Python)インストールでは、ファイル読み込み関数は4バイトのc_long(符号付きlong)を使用しています。 私は基本的なpythonファイルのread関数をテストしましたが、max signed long integer値(2,147,483,647)以上のオフセットを渡すことはできません。pythonファイルの読み込み "intが大きすぎてc longに変換できません"

import sys 
import platform 

inFileName = r'C:\Projects\Tampa\LASPY_EVLR\LAS_DATA\input\Large_LAS\20505.las' 
bit32_offset_signedlong = 2147483647 

print("python version: " + sys.version) 
print("platform: " + str(platform.architecture())) 
print("------------------------------") 

fileref = open(inFileName, "r") 

print("starting 32bit max read") 
datpart_32bitmax = fileref.read(bit32_offset_signedlong) 
print("------------------------------") 

print("starting 32bit max plus one read") 
datpart_32bitmaxplus1 = fileref.read(bit32_offset_signedlong + 1) 
print("------------------------------") 

この:これは私のpythonのインストールに問題が原因である、またはこれが本当にPythonでファイルから読み込むための最大の限界であれば...

私のテストコードは、下記の場合はわかりません

python version: 2.7.12 |Continuum Analytics, Inc.| (default, Jun 29 2016, 11:07:13) [MSC v.1500 64 bit (AMD64)] 
platform: ('64bit', 'WindowsPE') 
------------------------------ 
starting 32bit max read 
------------------------------ 
starting 32bit max plus one read 
Traceback (most recent call last): 
    File "C:\Projects\Tampa\LASPY_EVLR\check_clong.py", line 18, in <module> 
    datpart_32bitmaxplus1 = fileref.read(bit32_offset_signedlong + 1) 
OverflowError: Python int too large to convert to C long 
Press any key to continue . . . 

これは正常ですか?私は、ここで議論されているように、Pythonは "無制限"ファイルサイズ(利用可能なRAMとOSのビットサイズによってのみ制限される)を読むことができると考えました。読み取り方法。読み込みオフセットパラメータを使用してファイルの一部を読み込もうとしたときに、オーバーフローエラーが表示されたときに、32ビット符号付き整数よりも大きなファイルを読み書きできます。私の最終目標は、非常に大きなファイル(6GB)の末尾にいくつかのデータを追加することです。

Pythonのインストールに何か問題がありますか?もしそうなら、おそらく私はこの問題を解決するために何かできることがあります...

+0

ファイルをバイナリで開いてみますか? 'rb' – Wajahat

+0

ちょうど試しました。予想どおり変更はありません。 – ahm126

答えて

1

これは、あなたが呼び出している関数が32ビットのオフセット値を必要とするC関数の上に重ねられるために起こります。 Pythonの整数はこの範囲に限定されませんが、C関数があります。

また、読者はこれを管理していれば最大2GBの読書を指定することに注意してください。ファイルがその長さを超えると、2GBの文字列アイテムを処理する準備ができていますか?

+0

私は実際には非常に大きなLIDAR LAS形式のデータファイル(6GB)を読むためにlaspyライブラリを使用しています。私はlaspyがLASデータから非常に大きな配列のポイントデータの読み書きを処理するためにnumpy mmapを使用していると思います。このコードは〜800MBのテストファイルでは動作しますが、6GBファイルでは失敗します... – ahm126

+0

これはファイルサイズに2GBという制限がありますが、この動作はPythonの制御下にありません。 – holdenweb

+0

なので回避策はありますか?またはnumpy mmapを使ってファイルの一部を読み取ることができるのでなければ私は運が悪いですか? – ahm126

関連する問題