读取大型.csv文件mmap

问题描述 投票:0回答:1

我正在尝试打开 3.54GB 文件

s = open("C:/Users/a.bannerman/Desktop/code/TS_data/big.txt","r")
a = Mmap.mmap(s)

现在列出的内容:

3802655667-element Vector{UInt8}:
 0x30
 0x31
 0x2f
 0x30
 0x32
 0x2f
 0x32

现在我正在尝试逐行处理这个文件 - 甚至将其子集化,我可以这样做


1000-element Vector{UInt8}:
 0x30
 0x31
 0x2f
 0x30
 0x32
 0x2f
 0x32
    ⋮
 0x0a

如何解析内存地址处的数据(每个内存地址是否都指向.txt文件中的一行?)?当然,在这台机器上,如果我将所有内容解析为矩阵,数据帧,我将耗尽内存。 此时,我想迭代内存地址,提取一行并填充一个矩阵,我构建的数据帧,将每个块保存为 .csv,关闭,释放内存,然后执行下一批。数据本身有 n 行,大约 5 列。

对上面的内容还是很好奇 但这是使用

CSV.jl 

的答案
row_size = 10000
for rows in Iterators.partition(CSV.Rows("C:/Users/a.bannerman/Desktop/code/TS_data/big.txt"), row_size)
    df = DataFrame(rows) # resolve dataframe
    # perform operations on this specific chunk of file
end
julia mmap
1个回答
0
投票

CSV.jl 可以

mmap

从您的帖子来看,您似乎想要逐行处理一个巨大的 CSV 文件。这可以使用

CSV.Rows
而不是 CSV.File 来完成。

julia> @time CSV.Rows("huge_huge_file.csv")
  0.000654 seconds (1.39 k allocations: 37.500 KiB)
CSV.Rows("huge_huge_file.csv"):
Size: 10
Tables.Schema:
 :elemtype  Union{Missing, PosLenString}
 :elemid    Union{Missing, PosLenString}
 ...

现在有了一组行,您可以像其他任何东西一样对其进行迭代。

考虑这段代码:

df = DataFrame()
for row in CSV.Rows("huge_huge_file.csv")
    push!(df, row)
    nrow(df) > 5 && break
end

CSV.jl 文档内容如下:

CSV.Rows:一种使用分隔数据的替代方法,一次仅使用一行输入,这允许以比 CSV.File 更低的内存占用量“流式传输”数据。支持许多与 CSV.File 相同的选项,但列类型处理略有不同。默认情况下,每个列类型本质上都是 Union{Missing, String},即不进行自动类型检测,但可以手动提供列类型。解析时不使用多线程。构造 CSV.Rows 对象后,可以通过迭代“流式传输”行,其中每次迭代都会生成一个 CSV.Row2 对象,其操作类似于 CSV.File 的 CSV.Row 类型,其中可以通过 row.col1 访问各个行值,行[:col1] 或行[1]。如果单独处理每一行,则可以通过传递reusebuffer=true来节省额外的内存,这意味着将分配一个缓冲区来仅保存当前迭代行的值。 CSV.Rows 还支持 Tables.jl 接口,也可以传递给有效的接收器函数。

© www.soinside.com 2019 - 2024. All rights reserved.