【问题标题】:How to read a matrix skipping N rows and M columns in Julia (with a windows eol)如何在 Julia 中读取跳过 N 行和 M 列的矩阵(使用 windows eol)
【发布时间】:2018-07-26 10:06:25
【问题描述】:

我需要从 Julia 中读取一个制表符分隔的 800MB 矩阵,其中前 N 行和 M 列是标题,并且文件有一个 windows eol。

数据库自带matlab指令如下:

A = dlmread('mydatafile.txt','\t',N,M);

dlmread() 似乎在 julia 中已被 readdlm() 替换,但我不知道如何指定列偏移量和窗口 eof。

编辑:更正

【问题讨论】:

  • 什么是 C?应该是 M 吗?

标签: io julia


【解决方案1】:

经过几次尝试,我能得到的最好方法是加载整个矩阵,包括列和行标题,将其切片以删除标题并转换为浮动数据:

table = convert(Array{Float64,2},readdlm("myFile.txt",'\t', skipstart=2)[:,4:end]);

在配备 873MB (7824x7824) 矩阵的 SSD 磁盘的 i7 笔记本电脑上,这需要大约 51 秒。

很遗憾,也不能跳过初始列,因为我认为这是一种常见的情况,顺便说一下,它也会减少与使用dlmread() 的 matlab 脚本的差异。

【讨论】:

    【解决方案2】:

    查看readdlmdocumentation(您可以通过?readdlm 获得),您可以使用关键字

    • delim 指定分隔符
    • eol 指定行尾字符
    • skipstart 指定应忽略多少初始行。

    总计

    readdlm("mydatafile.txt", delim='\t', eol='\n', skipstart=N);

    我不知道如何忽略列。

    【讨论】:

    • 我可能是草率了,也许 OP 想要 eol="\r\n",因为它是 String 而不是 Char
    • 我用table = convert(Array{Float64,2},readdlm("myFile.txt",'\t', skipstart=2)[:,4:end]);“管理”了较小的表,但我认为它对于大表不会非常有效,因为它首先将所有内容作为 Any 导入,然后才进行切片和转换。
    • 是的,不会。如果readdlm 不能为你做,你当然可以逐行解析文件。我猜也欢迎 PR。
    • @Antonello 也许看看CSV.jl。它有一个可选参数,用于指定应该加快速度的列类型。从内存来看,Julia 在读取大型 csv 文件时的原始速度仍略逊于 R,但它每天都在提高,我怀疑使用上述软件包您会获得最佳速度。关于忽略列,我认为 Julia 还没有这种能力。目前,我认为您必须阅读所有专栏,然后放弃您不想要的专栏。
    • @ColinTBowers 谢谢,但 CSV 需要知道列的标题或其编号(header=3:end 不起作用)。尽管如此,它仍然保存到 DataFrame,并且由于某些原因,它需要花费大量时间并且生成的 df 行为奇怪(“小”文件有 ~7000 cols).. 我也尝试使用 Matrix 作为流,但它得到了库存永远。 Hoverall,使用readdlm,切片和转换是更快的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 2021-09-16
    • 1970-01-01
    • 2016-06-03
    • 1970-01-01
    • 2018-09-06
    • 1970-01-01
    相关资源
    最近更新 更多