我有一个大型(3Gb)二进制文件,我在为聚类数据编写的迭代算法期间随机访问(或多或少)。每次迭代都会从文件中读取大约 50 万次,并写入大约 10 万次新值。
我像这样创建 FileChannel ...
f = new File(_filename);
_ioFile = new RandomAccessFile(f, "rw");
_ioFile.setLength(_extent * BLOCK_SIZE);
_ioChannel = _ioFile.getChannel();
然后我使用一个双倍大小的私有 ByteBuffer 来读取它
private ByteBuffer _double_bb = ByteBuffer.allocate(8);
我的阅读代码看起来像这样
public double GetValue(long lRow, long lCol)
{
long idx = TriangularMatrix.CalcIndex(lRow, lCol);
long position = idx * BLOCK_SIZE;
double d = 0;
try
{
_double_bb.position(0);
_ioChannel.read(_double_bb, position);
d = _double_bb.getDouble(0);
}
...snip...
return d;
}
我这样写...
public void SetValue(long lRow, long lCol, double d)
{
long idx = TriangularMatrix.CalcIndex(lRow, lCol);
long offset = idx * BLOCK_SIZE;
try
{
_double_bb.putDouble(0, d);
_double_bb.position(0);
_ioChannel.write(_double_bb, offset);
}
...snip...
}
我的代码迭代所花费的时间大致随着读取次数线性增加。我已经对周围的代码进行了一些优化,以尽量减少读取次数,但我认为这是必要的核心集,而不会从根本上改变算法的工作方式,我现在想避免这种情况。
所以我的问题是,读/写代码或 JVM 配置中是否有任何东西可以加快读取速度?我意识到我可以改变硬件,但在我这样做之前,我想确保我已经从问题中挤出了每一滴软件汁液。
提前致谢