gpt4 book ai didi

r - 在 R 中将前 X 行从一个文件复制到另一个文件的最快方法? (跨平台)

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

我无法将文件加载到 RAM 中(假设用户可能想要包含 100 亿条记录的文件的第一个 10 亿)

这是我的解决方案,但我认为必须有更快的方法?

谢谢

# specified by the user
infile <- "/some/big/file.txt"
outfile <- "/some/smaller/file.txt"
num_lines <- 1000


# my attempt
incon <- file( infile , "r")
outcon <- file( outfile , "w")

for ( i in seq( num_lines ) ){

line <- readLines( incon , 1 )

writeLines( line , outcon )

}

close( incon )
close( outcon )

最佳答案

您可以使用 ff::read.table.ffdf为了这。它将数据存储在硬盘上,不使用任何 RAM。

library(ff)
infile <- read.table.ffdf(file = "/some/big/file.txt")

基本上你可以像 base::read.table一样使用上面的函数不同之处在于结果对象将存储在硬盘上。

您也可以使用 nrow参数并加载特定的行数。文档是 here如果你想读一读。一次,您已经阅读了文件,然后您可以对您需要的特定行进行子集化,甚至将它们转换为 data.frames如果它们适合 RAM。

还有一个 write.table.ffdf允许您编写 ffdf 的函数对象(由 read.table.ffdf 产生),这将使过程更加容易。

作为如何使用 read.table.ffdf 的示例(或 read.delim.ffdf 几乎相同)请参阅以下内容:
#writting a file on my current directory
#note that there is no standard number of columns
sink(file='test.txt')
cat('foo , foo, foo\n')
cat('foo, foo\n')
cat('bar bar , bar\n')
sink()

#read it with read.delim.ffdf or read.table.ffdf
read.delim.ffdf(file='test.txt', sep='\n', header=F)

输出:
ffdf (all open) dim=c(3,1), dimorder=c(1,2) row.names=NULL
ffdf virtual mapping
PhysicalName VirtualVmode PhysicalVmode AsIs VirtualIsMatrix PhysicalIsMatrix PhysicalElementNo PhysicalFirstCol PhysicalLastCol PhysicalIsOpen
V1 V1 integer integer FALSE FALSE FALSE 1 1 1 TRUE
ffdf data
V1
1 foo , foo, foo
2 foo, foo
3 bar bar , bar

如果您使用的是 txt 文件,那么这是一个通用的解决方案,因为每行都以 \n 结束。特点。

关于r - 在 R 中将前 X 行从一个文件复制到另一个文件的最快方法? (跨平台),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33755186/

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