ファイルの入出力について

このQ&Aのポイント
  • javaで数千件のデータとの照合を行うプログラムを作成しました。照合するデータをすべてメモリ上におくとエラーが発生し、ハードディスクから順次メモリ上に取り出すように修正しました。
  • プログラム実行中にハードディスクからのアクセスが多くなり、警告音が鳴りました。原因はディスクへのアクセスが多すぎたことです。
  • 質問:ディスクへのアクセスが多い場合、どのような対策が有効ですか?
回答を見る
  • ベストアンサー

ファイルの入出力について

 先日、javaで数千件のデータとの照合(マッチング) 処理を行うプログラムを作ったときのことですが、 照合するデータをすべてメモリ上におくとjava.lang. outofmemory のエラーがでるので、ハードディスクから順次メモリ上に取り出すようにしました。  RandomAccessFile でreadInt や readChar を繰り返し、10分間くらい使うものだったのですが、プログラムの修正など半日ほど使っていたら、ハードディスクが”ピー、ピー"という警告音のようなものを発しました。(プログラムを終了するととまりました。)  これは、ディスクへのアクセスが多すぎたことが 原因なのでしょうか。どうぞご回答よろしくお願い いたします。

  • Java
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.1

とりあえず、そのHDDディスクのバックアップをとり CHKDSK(SCANDISK)することをお勧めします。 破損クラスタがあるかも。 (破損クラスタが大量にあったら交換した方が良い) あと大量のデータの場合、ファイルのオープンクローズは 可能な限り少ない方がいいですし、 何度ものreadInt() はやめたほうが良いです。 (ファイルのリードはかなりのオーバーヘッドですし、少なからずHDDへの負担にもなります。) read(byte[] b, int off, int len) あるいはreadFully(byte[] b, int off, int len) を使ってください。

taro5088
質問者

お礼

ご回答ありがとうございます。 スキャンディスクをしてみたところ、 異常はないようでほっとしました。 やはりreadInt()を繰り返すより readやreadFullyなどで一気に読 みこむべきなのですね。readInt のほうが使い方が簡単だからと ついつい多用していました。 ディスクへの負担をへらすように 心がけたいと思います。 的確なアドバイスをくださり、 とても助かりました。 どうもありがとうございます。

関連するQ&A

  • java.lang.StringIndexOutOfBoundsException・・・?

    JAVAで作成したプログラムを実行すると 「java.lang.StringIndexOutOfBoundsException: String index out of range: 3 at java.lang.String.substring(String.java:1500)」 とエラーが表示されます。 この意味ってなんなのでしょうか?

  • postfixの.forwardについて、教えて!

    postfixの.forwardのパイプ処理を使って、javaのプログラムを呼び出すけど、エラー発生します。 .forwardファイル中身に"|java ReplyTest"を書きました エラーは:   Command died with status 1: "java ReplyTest". Command output: Exception in thread "main"      java.lang.NoClassDefFoundError: while resolving class: ReplyTest at java.lang.VMClassLoader.resolveClass(java.lang.Class) ...... (/var/spool/postfix/java.version=1.4.2) Caused by: java.lang.ClassNotFoundException: javax.mail.Session not found in [file:/usr/share/java/libgcj-3.4.6.jar, file:./, core:/] at java.net.URLClassLoader.findClass(java.lang.String) このように出た。 javaのプログラム実行前に、クラスパスを設定のは知ってますけど。単純にクラスパスを設定、javaプログラムを実行するのは、問題なし。.forwardのパイプを使って、自動的に実行すれば、上のようにエラー出た。 postfixのjavaクラスパスに関する環境変数有るか?どう設定しますか? 申し訳ないですが、教えてください。 お願いします。

  • CentOS4における自動起動について

    お世話になります。 CentOSにてプログラムを自動起動させたいと思っています。 rc*.dフォルダにスクリプトを作成し、サンプルプログラムが 動作することまでは確認できましたが、log4jを組み込んだところ プログラムが実行できなくなってしまいました。 #スクリプトをコマンドで実行すると、問題なく実行できました。 どなたかご教示ください。よろしくお願いします。 <エラー箇所> // 設定ファイルの読み込み DOMConfigurator.configure(パス + "log4j.xml"); <エラー内容> java.lang.ClassNotFoundException: org.apache.log4j.xml.DOMConfigurator at java.net.URLClassLoader$1.run(URLClassLoader.java:200) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:188) at java.lang.ClassLoader.loadClass(ClassLoader.java:307) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) at java.lang.ClassLoader.loadClass(ClassLoader.java:252) at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320) 【動作環境】 CentOS4 Java6 log4j 1.2.15

    • ベストアンサー
    • Java
  • javaの実行時のエラー

    javaを使って圧縮プログラムを作ったのですがコンパイルは通るのに実行時に Exception in thread "main"java.lang.StringIndexOutOfBoundsException: String index out of range: 80 at java.lang.String.charAt(String.java:455) at ashuku.char1(ashuku.java:51) at ashuku.kensa1(ashuku.java:23) at ashuku.main(ashuku.java:9) というエラーが出ます。このエラーの意味は何なのですか?教えてください。プログラムが長くて載せられないので、このエラーが出たときに何をチェックすればいいか教えてもらえると助かります。お願いします

    • ベストアンサー
    • Java
  • RMI

    ここのサイト通りの手順でやったのですが http://www.hellohiro.com/rmi.htm C:\JavaHello\RMI>java -Djava.security.policy=java.policy -Djava.rmi.server.codebase=file:///C:\JavaHello\RMI\ HelloWorldObj を実行するところで Exception in thread "main" java.lang.NoClassDefFoundError: Files\Java\RMI Caused by: java.lang.ClassNotFoundException: Files\Java\RMI\ at java.net.URLClassLoader$1.run(URLClassLoader.java:200) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:188) at java.lang.ClassLoader.loadClass(ClassLoader.java:307) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) at java.lang.ClassLoader.loadClass(ClassLoader.java:252) at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320) Could not find the main class: Files\Java\RMI\. Program will exit. このようなエラーメッセージがでて解決できません。 エラーをなくす方法を教えてください!

  • java実行時のメッセージについて

    50歳にてjavaを勉強しようとしているものです。 javaの本より例題を作成してみたのですが、うまくいきません。 javaをインストールしてjavacが正常でいざ実行した際、以下のメッセージが表示されました。何の意味かさっぱりわかりません。このサイトで質問するレベルではないかと思いますが、アドバイスいただければ幸いです。 作成したプログラムは class hello { public static void main(String[] args) { System.out.println("こんにちは"); } } javac ではエラー表示なし → C:\javabook\part1>javac Hello.java C:\javabook\part1> これを実行すると、 C:\javabook\part1>java Hello Exception in thread "main" java.lang.NoClassDefFoundError: Hello (wrong name: he llo) at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632) at java.lang.ClassLoader.defineClass(ClassLoader.java:616) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:14 1) at java.net.URLClassLoader.defineClass(URLClassLoader.java:283) at java.net.URLClassLoader.access$000(URLClassLoader.java:58) at java.net.URLClassLoader$1.run(URLClassLoader.java:197) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at java.lang.ClassLoader.loadClass(ClassLoader.java:307) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) at java.lang.ClassLoader.loadClass(ClassLoader.java:248) Could not find the main class: Hello. Program will exit. と表示されます。 何がエラーとなっているのでしょうか?

    • ベストアンサー
    • Java
  • ファイル実行時エラーがでる・・・(^^;)。

    JAVA超初心者です。初級者向けの本を見て、プログラムの勉強を始めてみました。コンパイルをするためのパスの設定はうまくいきました。Cドライブ直下に「java」フォルダを作りそこにファイル名「Hello.java」として保存しました。そのクラスファイル「Hello.java」をコマンドプロンプト上でC:\java>に続き「java Hello」と入力して、実行しようとすると、下記のエラーが出て困っています。Exception in thread "main"java.lang.NoClassDefFoundError:Hello です。解説本を見ると、環境変数の「CLASSPATH」の設定に関して問題があるようで、カレントディレクトリをあらわす「.」を追加すればいいというのですが、私にとって「.」って何?どこにどうつけるのか具体的手順がよく説明されておらず、意味不明です。 使用OSはWinXPなのですが、何をどうすればエラーに対処できるのか、プログラムが問題なく、実行できるのか、知りたいのです。ちなみに「JDK5.0(jdk-1_5_0-windows-i586)」を使用しております。保存場所は、「c:\Program Files\Java\」内です。どうかよろしくお願いします。

    • ベストアンサー
    • Java
  • Javaのメモリアロケーションについて

    Javaのメモリアロケーションについて質問です。 物理メモリ512MBのPCで、ある会計システムのデータ読込みの際にOutofMemoryのエラーが発生する為、Javaのメモリヒープサイズを Javaコントロールパネル内「Javaランタイムパラメーター」欄にXmx128mを設定しました。 読み込むデータが大きく、Xmx128mでもOutofMemoryとなるため、ヒープサイズに更に大きな値を設定するべくPCの物理メモリ1GB追加しました。 搭載メモリ1.5GBで使用可能メモリ1GBになりましが、Xmx256mを設定すると「アプリケーションをロードできませんでした」というエラーが発生し会計システムを起動することができません。 メモリを増やしたにも関わらず、どうして大きなメモリヒープサイズを設定できないのでしょうか? Javaを最インストールする他方法はないのでしょうか? どなたかご教授お願いいたします。 設定値:-Xms64m -Xmx256m Javaバージョン:1.6.0Update3 OS:WindowsXP IE:6

  • javaに詳しい方に質問です

    javaに詳しい方に質問です 私は家ではwindowXP、学校ではUNIXを使ってjavaを勉強中です あるブロック崩しのプログラムがあるのですが、家では実行出来たのですが、 学校ではよくわからないエラーが出てしまいました 内容は下記の通り [c]$ cd java [c java]$ javac Blockdx.java [c java]$ appletviewer Blockdx.html Warning: Cannot convert string "-misc-kochi mincho-medium-r-normal--*-140-*-*-c-*-jisx0208.1983-0" to type FontStruct java.lang.UnsupportedClassVersionError: Blockdx (Unsupported major.minor version 50.0) at java.lang.ClassLoader.defineClass0(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:539) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123) at sun.applet.AppletClassLoader.findClass(AppletClassLoader.java:157) at java.lang.ClassLoader.loadClass(ClassLoader.java:289) at sun.applet.AppletClassLoader.loadClass(AppletClassLoader.java:123) at java.lang.ClassLoader.loadClass(ClassLoader.java:235) at sun.applet.AppletClassLoader.loadCode(AppletClassLoader.java:561) at sun.applet.AppletPanel.createApplet(AppletPanel.java:619) at sun.applet.AppletPanel.runLoader(AppletPanel.java:548) at sun.applet.AppletPanel.run(AppletPanel.java:299) at java.lang.Thread.run(Thread.java:534) javaのバージョンは下記の通り 自宅 1.4.2_05 学校 1.6.0_18 学校でも家でもBlockdx.javaとBlockdx.htmlの二つのファイルを用意して Blockdx.javaをコンパイルした後、appletviewer Blockdx.htmlで実行したのは同じです 学校の先生いわく、バージョンかなぁと言っていましたが、よくわからないのが本音だそうです わかる方いらっしゃいますか?

    • ベストアンサー
    • Java
  • プログラム内でのPath設定

    javaのプログラム内でパスを設定することはできますか? public class Test { public static void main(String[] args) { System.setProperty("java.library.path", System.getProperty("java.library.path") + ";C:/library/path"); System.loadLibrary("library"); } } 上のようにすると以下のエラーが出ます。 java.lang.UnsatisfiedLinkError: no library in java.library.path at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1517) at java.lang.Runtime.loadLibrary0(Runtime.java:788) at java.lang.System.loadLibrary(System.java:834) at Test.main(Test.java:6) Exception in thread "main" 環境変数「PATH」に C:/library/path を設定すると System.loadlibrary("library") で libraryを読み込むことができます。 なぜ上のやり方では読み込めないか教えてください。

    • ベストアンサー
    • Java

専門家に質問してみよう