我有一个包含 1500 万行的文件(不适合内存)。我还有一个小的行号向量——我想要提取的行。
我怎样才能一次读出这些行?
我希望有一个 C 函数可以一次性完成。
我有一个包含 1500 万行的文件(不适合内存)。我还有一个小的行号向量——我想要提取的行。
我怎样才能一次读出这些行?
我希望有一个 C 函数可以一次性完成。
诀窍是使用连接并在之前打开它read.table
:
con<-file('filename')
open(con)
read.table(con,skip=5,nrow=1) #6-th line
read.table(con,skip=20,nrow=1) #27-th line
...
close(con)
您也可以尝试scan
,它更快并且提供更多控制。
这里有一些讨论: Reading in only part of a Stata .DTA file in R
如果它们是连续的并且位于文件的顶部,则只需使用,nrows
参数 toread.csv
或任何read.table
家庭。如果没有,您可以将,nrows
和,skip
参数组合起来重复调用read.csv
(每次调用读取新行或一组连续行),然后rbind
将结果放在一起。
如果您的文件有固定的行长,那么您可以使用“seek”跳转到任何字符位置。因此,只需为您想要的每个 N 跳转到 N * line_length,然后读取一行。
但是,来自 R 文档:
Use of seek on Windows is discouraged. We have found so many
errors in the Windows implementation of file positioning that
users are advised to use it only at their own risk, and asked not
to waste the R developers' time with bug reports on Windows'
deficiencies.
您也可以在 C 中使用标准 C 库中的 'seek',但我不知道上述警告是否也适用!
在获得 R 解决方案/答案之前,我已经在 Ruby 中完成了它:
#!/usr/bin/env ruby
NUM_SEQS = 14024829
linenumbers = (1..10).collect{(rand * NUM_SEQS).to_i}
File.open("./data/uniprot_2011_02.tab") do |f|
while line = f.gets
print line if linenumbers.include? f.lineno
end
end
运行速度快(与我的存储可以读取文件一样快)。
我根据此处的讨论编译了一个解决方案。
scan(filename,what=list(NULL),sep='\n',blank.lines.skip = F)
这只会向您显示行数,但不会读取任何内容。如果你真的想跳过空行,你可以将最后一个参数设置为 TRUE。