アプリ版:「スタンプのみでお礼する」機能のリリースについて

RandomAccessFileを使用して、ファイルをアクセスすると「プロセスはファイルにアクセスできません。別のプロセスが使用中です。」のメッセージが出力されるときがある。
以下は例です。
<pre>
DataInputStream index = null;
RandomAccessFile data = null;
long seek = 0;
int row = 0;
try {
index = new DataInputStream(new FileInputStream(new File("index.db")));
data = new RandomAccessFile("data.db", "rw");
byte[] buffer = new byte[32];
while (true) {
++row;
seek = index.readLong();
data.seek(seek);
data.read(buffer);
}
} catch (EOFException e) {
} catch (IOException e) {
System.err.println(String.format("[%d]: seek=%d -- エラーの発生したレコード番号.", row, seek));
e.printStackTrace();
} finally {
if (index != null) {
index.close();
}
if (data != null) {
data.close();
}
}
</pre>

エラーが発生するレコード位置(row)は、まちまちで実行する度に変化する。
1000件目であったり、157件目であったり。。。
index.dbは約100万件あります。

(a).正常に動作する環境
OS: Windows XP、Windows 7
CPU: Core 2 Duo、CORE i5

(b).エラーが発生する環境
OS: Windows server 2008 R2 standees sp1
CPU: Intel(r) Xeon(r) CPU X5690@3.46GHz (2プロセッサ)

どういった原因が考えられますか?
因みに、RandomAccessFileのモードを"r"にすると正常に動作しました。
モードで排他ロックするのでしょうか?
RandomAccessFile#getChannel().lock()は使用していません。

(a)の方は最大4コアで、(b)の方は24コアあります。
(b)の方が早すぎてリードにブロックされているとかありますか?
ただモードを変更しただけで正常に動作するのも理解できません。

よろしくお願いいたします。

A 回答 (1件)

複数同時に実行、もしくはファイルを使用していませんか?


ウィンドウズでは、書き込み可能なモードで開くとロックしてしまいます。
読み込みだけで良いなら、ロックしない分rだけにした方が早いはずです。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!