ruby - ruby 中的大型矩阵代数计算

标签 ruby csv matrix

我正在从事一个涉及使用大型数据矩阵进行计算的项目。我有 10,000 行和 100 列的 CSV 文件,其中有 10 个。目前,我正在运行一个后台作业,从每个 CSV 中读取数据,将其拉入数组,对数据运行一些矩阵乘法计算,然后移动到下一个 CSV。我确信有更好的方法来执行此操作,因为处理作业所需的大部分时间似乎都花在了打开 CSV 文件上。我的问题实际上归结为我应该如何存储当前在这些 CSV 文件中的数据以便轻松访问它并以更有效的方式运行计算。任何帮助将不胜感激

编辑

正如评论中所建议的,我想补充一点,矩阵密度是 100%,数字都是 float 。

最佳答案

对于任何类型的大数据,CSV 都是一种非常、非常低效的格式。鉴于您的所有数据都是数字,并且您的数据大小是一致的,紧凑的二进制格式将是最好的。如果您将数据存储为网络字节顺序的 1,000,000 个 4 字节整数的二进制文件,其中前一百个是第一行,第二个是第二个,依此类推,它会将您的文件大小从 12MB 减少到 ~8MB,并且完全去除解析 CSV 的低效(这真的很低效)。要将您的数据转换为这种格式,请尝试运行此 Ruby 代码(我假设数据是您的 CSV 的二维数组):

newdat = data.flatten.map {|e| e.to_f}.pack("G*")

然后将 newdat 作为新数据写入文件:

f = File.open("data.dat", 'wb')
f.write(newdat)
f.close

从文件中解析数据:

data = File.open("data.dat", 'rb').read.unpack("G*").each_slice(100).to_a

这会将数据作为二维数组设置到您的矩阵。

注意:我实际上无法为您提供具体的效率数据,因为我周围没有任何充满 float 的巨型 CSV 文件。但是,这应该更有效率。

关于ruby - ruby 中的大型矩阵代数计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19731513/

相关文章:

ruby-on-rails - 并非所有页面都需要验证 Rails

ruby Gemspec 依赖项 : Is possible have a git branch dependency?

javascript - d3 csv 数据加载

javascript - 转换表索引

C: "shift"矩阵的巧妙方法?

ruby,如何找到数组的所有元素都在日期范围内

ruby-on-rails - 使用 Oj.dump 序列化时将符号转换为字符串

ruby - Ruby 中的 CSV 导入 RSpec 错误

file - 如何在 Spark 中写入 CSV

c - 邻接矩阵查找邻居