gpt4 book ai didi

matrix - Julia:如何修改已保存为二进制文件的矩阵的列?

转载 作者:行者123 更新时间:2023-12-04 21:09:09 25 4
gpt4 key购买 nike

我正在处理太大而无法存储在内存中的大型数据矩阵 (Nrow x Ncol)。相反,将数据保存到二进制文件是我工作领域的标准。由于工作的性质,我一次只需要访问矩阵的 1 列。我还需要能够修改列,然后将更新的列保存回二进制文件。到目前为止,我已经设法弄清楚如何将矩阵保存为二进制文件以及如何将矩阵的 1 个“列”从二进制文件读取到内存中。但是,在编辑列的内容后,我无法弄清楚如何将该列保存回二进制文件。

例如,假设数据文件是一个已保存到磁盘的 32 位单位矩阵。

Nrow = 500
Ncol = 325
data = eye(Float32,Nrow,Ncol)
stream_data = open("data","w")
write(stream_data,data[:])
close(stream_data)

从磁盘读取整个文件,然后重新整形回矩阵很简单:
stream_data = open("data","r")
data_matrix = read(stream_data,Float32,Nrow*Ncol)
data_matrix = reshape(data_matrix,Nrow,Ncol)
close(stream_data)

正如我之前所说,我正在使用的数据矩阵太大而无法读入内存,因此上面编写的代码通常无法执行。相反,我需要一次处理 1 列。以下是将矩阵的 1 列(例如第 7 列)读入内存的解决方案:
icol = 7
stream_data = open("data","r")
position_data = 4*Nrow*(icol-1)
seek(stream_data,position_data)
data_col = read(stream_data,Float32,Nrow)
close(stream_data)

请注意,“position_data”变量中的系数“4”是因为我使用的是 Float32。另外,我不完全理解 seek 命令在这里做什么,但它似乎根据以下测试给了我正确的输出:
data == data_matrix     # true
data[:,7] == data_col # true

为了这个问题,假设我已经确定我加载的列(即第 7 列)需要用零替换:
data_col = zeros(Float32,size(data_col))

现在的问题是弄清楚如何将此列保存回二进制文件而不影响任何其他数据。当然,我打算使用“写入”来执行此任务。但是,我不完全确定如何进行。我知道我需要首先打开数据流;但是我不确定我需要使用什么“模式”:“w”、“w+”、“a”还是“a+”?这是使用“w”的失败尝试:
icol = 7
stream_data = open("data","w")
position_data = 4*Nrow*(icol-1)
seek(stream_data,position_data)
write(stream_data,data_col)
close(stream_data)

原始二进制文件(在我尝试编辑二进制文件失败之前)在磁盘上占用了 650000 字节。这与矩阵大小为 500x325 且 Float32 数字占用 4 个字节(即 4*500*325 = 650000)的事实一致。但是,在我尝试编辑二进制文件后,我观察到二进制文件现在仅占用 14000 字节的空间。一些快速的心算显示 14000 字节对应于 7 列数据 (4*500*7 = 14000)。快速检查确认二进制文件已用大小为 500x7 且元素全为零的新矩阵替换了所有原始数据。
stream_data = open("data","r")
data_new_matrix = read(stream_data,Float32,Nrow*7)
data_new_matrix = reshape(data_new_matrix,Nrow,7)
sum(abs(data_new_matrix)) # 0.0f0

我需要做什么/更改才能仅修改二进制文件中的第 7 个“列”?

最佳答案

您可以使用 SharedArrays对于您描述的需求:

data=SharedArray("/some/absolute/path/to/a/file", Float32,(Nrow,Ncols))
# do something with data
data[:,1]=a[:,1].+1
exit()

# restart julia
data=SharedArray("/some/absolute/path/to/a/file", Float32,(Nrow,Ncols))
@show data[1,1]
# prints 1

现在,请注意,您应该处理同步以从/向该文件读/写(如果您有异步 worker ),并且您不应该更改数组的大小(除非您知道自己在做什么)正在做)。

关于matrix - Julia:如何修改已保存为二进制文件的矩阵的列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38449983/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com