Julia 什么';导入阵列数据并以特定格式保存阵列数据的最快方法是什么?

Julia 什么';导入阵列数据并以特定格式保存阵列数据的最快方法是什么?,julia,Julia,我有大约1000个具有2D阵列的模拟数据,阵列大小为1000(行),7(列) 首先,我尝试导入和导出数组,只是为了查看计算速度,我编程如下 输入数据结构 SIMULATION RESULTS 0.599566E+00 0.666925E-06 0.3348E+02 0.2527E+03 -0.6948E+04 ... 0.599633E+00 0.666924E-06 0.3394E+02 0.2529E+03 -0.6949E+04 ... 0.599699E+0

我有大约1000个具有2D阵列的模拟数据,阵列大小为1000(行),7(列)

首先,我尝试导入和导出数组,只是为了查看计算速度,我编程如下

输入数据结构

SIMULATION RESULTS
 0.599566E+00 0.666925E-06   0.3348E+02   0.2527E+03  -0.6948E+04  ...
 0.599633E+00 0.666924E-06   0.3394E+02   0.2529E+03  -0.6949E+04  ...
 0.599699E+00 0.666922E-06   0.3424E+02   0.2528E+03  -0.6949E+04  ...
 0.599766E+00 0.666920E-06   0.3440E+02   0.2527E+03  -0.6949E+04  ...
 0.599833E+00 0.666919E-06   0.3460E+02   0.2525E+03  -0.6948E+04  ...
 0.599899E+00 0.666919E-06   0.3488E+02   0.2522E+03  -0.6948E+04  ...
 0.599966E+00 0.666919E-06   0.3530E+02   0.2520E+03  -0.6948E+04  ...
.
.
.
初试

using Glob
filename = glob("*.dat*")
for i in filename
    data = readdlm(i, Float64, skipstart=1)
    writedlm("new_"*i, data)
end
close(data)
第二,尽量保持特定的格式

using Glob
filename = glob("*.dat*")
for i in filename
    data = readdlm(i, Float64, skipstart=1)
    m = (a->(@sprintf "%15.3f" a)).(data)
    writedlm("new_"*i, m, "" , quotes=false)
end
close(data)
但问题是计算速度很慢

因此,请给我一些建议,以便我可以更快地处理阵列数据(如果我不这样做,请告诉我)


请按照朱莉娅的风格教我一些更好的方法。)

你不应该手工写这篇文章。尝试使用极其高效的CSV.jl包来读取/写入分隔文件:

using DataFrames
using CSV

# read from disk
df = CSV.read("fname.dat", DataFrame, [options go here])

# do your calculations
df.result = df.column1 + df.column2

# write to disk
CSV.write("new.dat", df)
CSV.jl是所有流行语言中最快的分隔文件读写器。有关更多信息,请阅读此旧博文:


为了纠正上面关于IO速度在Julia和Python中相似的评论,CSV.jl实现比Python的pandas快了10倍到20倍。

为什么标记为
Python
,请阅读。我不知道Julia的情况,但在python中,您可以使用模块来测量执行时间。无论如何——是的,python的速度不是很快;你要么接受这一点,要么使用其他工具来完成任务。此外,还有许多因素决定您的运行时间,例如,当您正在读取数据时:您无法用快速编程语言解决速度慢的HDD。“Julia比python快得多”:这句话通常是正确的。由于JIT,带有循环的纯Python代码确实经常比Julia中的代码慢,但是对于Numpy调用,这并不总是正确的。对于像您这样的IO有界操作,这两种操作的速度可能相同。如果您从快速SSD加载数据,您可以尝试并行化循环(某些SSD可以更快地并行读取数据)。如果您需要更多低级代码,请查看
Printf.format(stdout,Printf.format“%15.3f”,3.5)
。当然,用您的流替换
stdout
,用您拥有的
Float64
值替换
3.5
。这将避免具体化
String
s,并且应该更快-您将避免大量垃圾收集。仍然
delimitedFile
CSV.jl
在整个优化过程中会有更好的效果。据我所知,Kwon希望在保存浮动之前应用
printf
格式。这就是这里的问题-我没有看到任何
CSV
Float64
格式选项。你是对的,他似乎还想保留字符串的特定格式。你在上面另一个帖子中的评论对他来说是一个很好的方向。谢谢