1

我给出了一些文件,它们都具有相同的大小。我要做的是将这些文件加载​​到Numo::Narray中,每个文件都需要位于该数组的不同行中。在创建 Narray 之前,文件的数量及其大小是已知的。我现在使用的是 8 位无符号整数。

示例:对于 5 个大小为 512 的文件,我需要形状为 [5, 512] 的多维数组。数据应该存储在伽罗瓦域中。这是至关重要的,因为这个矩阵将用于数学运算。我现在用来存储数据的是二进制数据转换的 8 位无符号整数数组。遗憾的是,ruby 的“read”和“unpack('*C')”方法的性能还不够高。

我已经用旧版本的NArray做到了这一点,但是性能不够好,因为我必须首先创建用零填充的固定大小的 NMatrix,将数据加载到普通的 Ruby 数组并替换 NMatrix 的给定行。这个新库非常大,我找不到插入行或动态添加数据到行的方法。我是否必须声明固定的 NArray 或者可能有一种方法可以通过将数据直接从 file.read 方法加载到 Narray 来动态地做到这一点,这样我就不必创建辅助 ruby​​ 数组?

由于我对高性能感兴趣,因此将不胜感激最佳解决方案。

4

1 回答 1

2

假设文件 data0 ~ data4 中有 512 个整数存储为 8 位无符号整数二进制数据。然后,您可以将每个文件中的 8 位无符号整数值存储在 Numo::UInt8 数组的每一行中,如下所示,

require "numo/narray"

n, m = 5, 512

string = ""
n.times do |k|
  string.concat File.binread("data#{k}", m)
end

na = Numo::UInt8.from_binary(string, [n,m])

此代码将应转换为 NArray 的字符串数据组合成单个字符串,并使用Numo::Uint8.from_binary. 但是,在我的环境中尝试的时候,在文件加载部分是限速的,我觉得from_binary方法也不算太慢。

如果您当前使用 HDD 作为存储设备,您可能需要考虑使用 SSD 或其他更快的存储设备。

于 2021-07-08T11:39:01.620 回答