首页 > 解决方案 > 在 Julia 中使用巨大数组的有效方法

问题描述

我有大量的实验数据,这些数据是用 Python 编写的 UI 收集的。这些数组的大小约为数十 GB,存储为无符号整数并通过已知因子转换为浮点数。此数组的典型大小为 64 x 64 x 10^5 个条目。在 pythonic UI 中,一切都运行得非常顺利。我们几乎实时地进行可视化,可以绘制每个一维子阵列(在长方向上)的许多行为,加载和关闭它们。然后将它们保存为 hdf5 文件。

当我尝试在一台更好的计算机上在 Julia 中对它们进行数字处理时,一切都变得迟缓了。超级慢。反应迟钝。所以我显然必须做一些非常错误的事情。

代码的实际示例将是以下函数:


function centerandreshapedata(xxs::Array, factor::Number)
    irrrelevant,largo=size(xxs)
    aux=Array{Int16}(undef, 64,64, largo);
    result=Array{Float16}(undef, 64,64, largo);
    for j=1:64,k=1:64
        aux[k,j,:]=xxs[j+(k-1)*64,:]
    end
    result=((aux.-2048).*factor);
    # factor is converting the floats to Float64
    result=convert.(Float16, result)
    return result
end


function DiscreteLaplacian(data)
    temp=copy(Datos)
    (mu,lu)=size(Datos)    
    izq=reshape(temp[1,:],(1,lu))
    der=reshape(temp[end,:],(1,lu))
    #Padding the data
    temp=vcat(izq, temp, der)
    temp=hcat(temp[:,1], temp, temp[:,end])
    largo,ancho=size(temp)
    aux=Array{Float32}(undef, 3,3)
    result=zeros(size(temp))

 for j=2:largo-1, k=2:ancho-1
        aux=temp[j-1:j+1,k-1:k+1]
        result[j,k]=sum(LaplacianKernel.*aux)
    end
    #DO  Crop the borders
    result=result[2:end-1,2:end-1]
    return result
end

我需要对这些数据做的典型事情是重塑、应用有限差分运算符和其他线性变换、逐个切片搜索某些值,等等。python UI 似乎比我的 Julia 规则响应更快。我对此感到非常困惑。

用 PyPlot.jl 绘制它们也需要很长时间,但这可能是另一个问题。

标签: arrayspython-3.xmemorymultidimensional-arrayjulia

解决方案


推荐阅读