如何使用 Java + LibGDX 有效地读取浮点数的文本文件?

How to read text file of float numbers efficiently with Java + LibGDX?

我正在使用 Java/LibGDX 编写一个小型科学数据可视化应用程序。该应用程序首先读取一个描述 4d 数组的文本文件:

188 225 3 6 0.001 -0.023 1.345 2.475 ... 4.327

前四个整数指定数组的维度:188 x 255 x 3 x 6,后面是 188 x 255 x 3 x 6 ~= 760000 个数字。文本文件总共需要大约 5MB space.

4D 数组表示 'augmented' 图像,高 188 像素,宽 255 像素,具有 3 个颜色通道 (RGB)。每个像素通道有 6 个 'parameters',而不是常规 RGB 图像中只有一个。

我使用了下面从官方文档中复制的方式将space分隔的列表读入内存:

FileHandle ptmFile = Gdx.files.internal(filename);
String ptmText= ptmFile.readString();

然后我创建了一个简单的包装器 class AugPixel,它实际上是每个像素的 6 元素数组的包装器。我使用扫描仪从字符串中读取和解析每个数字(请原谅我的半伪代码):

Scanner scan = new Scanner(ptmText);
int nRows = scan.nextInt();
int nCols = scan.nextInt();
int nColors = scan.nextInt();
int nParams = scan.nextInt();


AugPixel[][][] im = new AugPixel[nRows][nCols][nColors];

for (i = 1~nRows)
  for (j = 1~nCols)
    for (k = 1~nColors)
      im[i][j][k] = new AugPixel(nParams);
      for (m = 1~nParams) 
        im[i][j][k].addParam(scan.nextFloat());

此方法适用于桌面版。加载文件和构建所有 AugPixel 对象大约需要 5 秒。但是,当我将应用程序移动到实际的 android 设备(Nexus 7 32G(第 2 代))时,加载过程需要 5 分钟!

所以我的问题是:有什么办法可以加快加载过程吗?我可以自由地重新定义我认为合适的文件组织。

谢谢!

如果从文件中读取数据是主要瓶颈,您可以尝试使用某种形式的异步 IO,以便您可以在加载其余部分的同时处理部分字符串。

如果主要瓶颈是解析字符串,您可以尝试多线程处理或切换到二进制文件格式。如果您愿意放弃文本格式,最好的解决方案可能是切换到二进制文件格式,这应该会大大减少处理时间和可能的文件大小。