java 读取海量数据_读取/存储大量多维数据的最快方法?(Java)

本文探讨了Java中读取和存储大量多维数据的效率问题。通过对比不同数据结构,如3D数组和一维数组,分析了内存访问速度和缓存一致性对性能的影响。实验结果显示,虽然一维数组在某些情况下表现更好,但优化空间有限,且可能不值得投入大量时间进行优化。
摘要由CSDN通过智能技术生成

小编典典

1)为什么数组这么慢?

正如其他人指出的那样,您正在将苹果与橙子进行比较。三重数组很慢,因为它需要解引用三次(至少在内部-是的,“

Java中没有指针”)。但是再一次,您不能引用单个整数变量…

2)为什么当我将其放入内部循环时它变得更慢:

values[z][y][x] = 1; // (notice x and z switched)

因为您降低了缓存一致性。变化最快的索引应该是最后一个索引,以便大多数内存访问在同一缓存块内彼此相邻发生,而不是强迫处理器等待直到从主RAM中读取这些块。

3)最重要的是:我可以使用一种数据结构,该结构与分配单个整数一样快,但是可以存储与3D数组一样多的数据?

否。没有这样的结构,因为整数变量适合机器寄存器(甚至比处理器的内存高速缓存还快),并且始终可以比您要提及的任何其他事物更快地访问。处理器速度比主存储器速度快得多。如果您的“工作集”(您需要对其进行操作的数据)不适合寄存器或高速缓存,则您将不得不付出一定的代价才能从RAM(或更糟的是从磁盘)中获取数据。

话虽这么说,Java会对每个数组访问进行边界检查,而且似乎对优化边界检查并不聪明。以下比较可能是有趣的:

public static long test1(int[][][] array) {

long start = System.currentTimeMillis();

for ( int x = 0; x < 400; x++ ) {

for ( int y = 0; y < 300; y++ ) {

for ( int z = 0; z < 400; z++ ) {

array[x][y][z] = x + y + z;

}

}

}

return System.currentTimeMillis() - start;

}

public static long test2(int [] array) {

long start = System.currentTimeMillis();

for ( int x = 0; x < 400; x++ ) {

for ( int y = 0; y < 300; y++ ) {

for ( int z = 0; z < 400; z++ ) {

array[z + y*400 + x*400*300] = x + y + z;

}

}

}

return System.currentTimeMillis() - start;

}

public static void main(String[] args) {

int[][][] a1 = new int[400][300][400];

int[] a2 = new int[400*300*400];

int n = 20;

System.err.println("test1");

for (int i=0; i

System.err.print(test1(a1) + "ms ");

}

System.err.println();

System.err.println("test2");

for (int i=0; i

System.err.print(test2(a2) + "ms ");

}

System.err.println();

}

在我的系统上,输出是

test1

164ms 177ms 148ms 149ms 148ms 147ms 150ms 151ms 152ms 154ms 151ms 150ms 148ms 148ms 150ms 148ms 150ms 148ms 148ms 149ms

test2

141ms 153ms 130ms 130ms 130ms 133ms 130ms 130ms 130ms 132ms 129ms 131ms 130ms 131ms 131ms 130ms 131ms 130ms 130ms 130ms

因此,仍有一些改进的余地…但是我真的不认为这值得您花时间。

2020-11-16

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值