- 締切済み
RandomAccessFileで2GB以上
Java(JDK1.6.0_26)でAndroidアプリを開発しています。 RandomAccessFileを使ってバイナリファイルの一部を読みこむロジックを書いています。 1.8GBのファイルでは問題なく読みこみできますが、3.9GBのファイルではseek時に例外エラー(IOException)が発生してしまいます。 以下コード --------------------------------------------- long lSeekPos ; lSeekPos = 特定の場所を指定 ( 3985344606をセット) File fAccessFile = new File( sFilePath); RandomAccessFile raFile = new RandomAccessFile( fAccessFile, "r"); raFile.seek( lSeekPos) ; <--ここで例外エラー ~~以下読み込み処理~~ raFile.close() ; --------------------------------------------- 例外エラーの詳細を調べると "java.io.IOException: Value too large for defined data type" となっています。 API定義を見ている限り seek(long)となっているので、3.9GB位は問題ないと思いますが、何か回避策はあるでしょうか? ■開発環境 WindowsXP SP3 Eclipse 3.5 Galileo JDK 1.6.0_26 AndroidSDK 2.2 以上、宜しくお願い致します。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
失礼なやっちゃな http://guide.okwave.jp/guide/netiquette_amanner.html 「質問内容がよくわからないけど力になりたい」ときは、回答欄を利用して疑問点を質問者に聞いてみよう! 問題解決につながるかも! 抵触してるとおもうなら通報してください。 もし2GBの壁ならOSレベルの問題ですが それでもいいなら解決法 OSを64Bit OSに入れ替えてください。 メモリを増設してください。 2GBの壁 32ビットWindowsアプリケーションでは、1プロセスごとの4GBのアドレス空間うち、カーネルが2GBを予約しており、アプリケーションが自由に使用可能なのは2GBである。この壁に達してくるとマイクロソフトは主に2つの対処手段を打ち出した。1つはアドレスウィンドウ化拡張 (AWE)[14]である。4GBを超えるメモリを部分部分で切り替えながら読み書きする方法であり、MS-DOSの頃のEMSのようだという意見もある[15]。もう1つは、4-Gigabyte Tuning (4GT) の導入である。カーネルとアプリケーションのアドレス空間の配分を通常の2GB-2GBから、1GB-3GBに変更する手法である[11]。カーネルリソースが減少するため、サーバー用途(特にWebサーバー)には安定性の面から向かないという欠点がある。なお、64ビットWindows上では、4GT対応32ビットアプリケーションは4GBほぼすべてアプリケーションが使用可能である[12] Android Phone ではもっと低い位置で壁がきます。
2G の壁 じゃないの?
補足
2GBの壁かどうかではなくて、2GBを超えるバイナリファイルに対して読み書きを行う場合の手法を教えて欲しかったんですが。。。 ちなみに?をつけるような不明瞭な回答はしないでください。
お礼
回答ありがとうございます。 失礼な補足を書いてしまいました。お詫びします。 結果としてJavaではRandomAccessFileで2GB以上のファイルを扱えないとのことですのでアプリの要求仕様を変更して問題を回避したいと思います。 2GBの壁ですが、ファイルサイズが符号付Integerの最大値(32bit環境)の2147483647を超えた部分から読み書き、シークなどができなくなります。 投稿後の調査でこれについてはバグ報告されており、回避策はないと書かれていました。 http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4290024 実は同じ仕様のWindowsアプリ(32bit)をVC++でも開発中です。 そちらではファイルサイズに2GBの上限なくランダムアクセスできるようになっています。 Javaでも同じようにランダムアクセスでファイル入出力したかったのですが、C++の開発が中心でJavaの開発経験が殆どないため、皆さんはどのようにして2GBを超えるファイルにランダムアクセスしているのか知りたかった次第です。(説明不足でしたね) 結論としてランダムアクセスではLargeFileにアクセスできないということで理解しました。