Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ruby中的大型矩阵代数计算_Ruby_Csv_Matrix - Fatal编程技术网

ruby中的大型矩阵代数计算

ruby中的大型矩阵代数计算,ruby,csv,matrix,Ruby,Csv,Matrix,我正在从事一个项目,涉及使用大型数据矩阵进行计算。我有10000行100列的CSV文件,其中有10个。目前,我正在运行一个后台作业,从每个CSV读取数据,将其拉入数组,对数据运行一些矩阵乘法计算,然后移动到下一个CSV。我相信有更好的方法可以做到这一点,因为处理工作所需的大部分时间似乎都花在打开CSV上。我的问题实际上归结为我应该如何存储这些CSV文件中当前的数据,以便轻松访问它并以更高效的方式运行计算。任何帮助都将不胜感激 编辑 正如评论中所建议的,我想补充一点,矩阵密度是100%,数字都是浮

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

编辑

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

CSV对于任何类型的大型数据来说都是非常低效的格式。考虑到您的所有数据都是数字,并且数据大小是一致的,因此最好使用紧凑的二进制格式。如果以网络字节顺序将数据存储为1000000个4字节整数的二进制文件,其中前100个是第一行,第二行是第二行,依此类推,则会将文件大小从12MB减少到~8MB,并完全消除解析CSV的低效性(这是非常低效的)。要将数据转换为这种格式,请尝试运行以下Ruby代码(我假设数据是CSV的2d数组):

然后将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
这会将矩阵中的数据设置为二维数组

注意:我实际上不能给你这个效率的确切数字,因为我没有任何巨大的CSV文件充满了浮动。然而,这应该更有效率

您是否考虑过使用以二进制形式保存数组?我没用过,但它看起来非常简单:

FNAME = 'matrix4.mtx'
a = [2.3, 1.4, 6.7]

File.open(FNAME, 'wb') {|f| f.write(Marshal.dump(a))}
b = Marshal.load(File.binread(FNAME)) # => [2.3,1.4,6.7]

当然,您必须将整个阵列读取到内存中,但按照当前标准,阵列似乎没有那么大

您可以始终将文件加载到NMatrix中,然后使用
NMatrix\write
以NMatrix二进制格式保存。NMatrix仍然需要一个CSV读写器,但我猜它的实现会非常简单——或者您可以在中请求它

后来:

y = NMatrix.read("mymatrix.binary")
# => NMatrix

它可以处理密集和稀疏存储。

您的CSV文件有多大(以MB为单位,而不是行/列)。CSV编号中的所有单元格值都是吗?您是否考虑过将非零值存储在数据库中,每个记录都是
行、列、值
?要对矩阵进行操作,您是否查看了矩阵?还有一些用于矩阵运算的宝石,例如。CSV每个大约为12MB。这些值都是数字。对于矩阵运算,我使用矩阵类。这很有效。我想在数据库中存储是一种选择,尽管在Heroku上,这可能需要昂贵的数据库计划,因为这需要数百万行。看起来CSV中的数据实际上是以字符串形式存储的。在运行你建议的代码之前,有没有一种快速转换为浮动的方法?@dvanderb:现在就试试。接近了。这是可行的,但我得到了以下错误:Encoding::UnfinedConversionError:“\x93”当我尝试将newdat写入到file@dvanderb:您必须以
'wb'
模式打开文件。甚至更近。现在,当我尝试解析:data=File.read(“data.dat”,“rb”)。解包(“G*”)。每个片段(100)。to_类型错误:无法将字符串转换为IntegerGood建议。封送处理往往是将Ruby数据转储到文件并读回的最快方式。但是,如果数据必须由非Ruby工具读取,则不太好。这似乎也可以。我真的不知道哪个更快(这还是公认的解决方案),但就我的应用而言,两者似乎都足够快。谢谢你的帮助。
x.write("mymatrix.binary")
y = NMatrix.read("mymatrix.binary")
# => NMatrix