2013-08-16 176 views
0

我有一个巨大的逗号分隔的文件(每秒1.5 Gb),并希望在R.读取特定行从一个巨大的文件*快速*

我见过从文件中读取一个特定行(许多)这个问题的版本很多次,都表明类似

con = file(fileName) 
open(con) 
scan(con, what=list("character", "character"), skip=1000000, nlines=1, sep="\t", quiet=TRUE) 

这样的作品,但它仍然是极其缓慢 - 我们20到30秒之间交谈读一行!

有没有更快的方法?当然,必须有一种快速的方式来跳转到特定的线...

非常感谢!

+0

你可以使用'data.table'! – Metrics

+3

http://stackoverflow.com/questions/18235269/efficiently-reading-specific-lines-from-large-files-into-r – Peyton

回答

0

你知道关于文件结构的任何其他内容吗?

如果每行/行具有完全相同的字节数,那么您可以计算字节的数量并在行的开头计算seek

但是,如果每行的字节数不完全相同,那么您需要读取每个字符,检查它是否是换行符(或其他回车符,或两者)并计算它们以查找你正在寻找的线路。这是skip参数scan和朋友所做的。

可能有其他工具可以更快地进行读取和计数,以便您可以预处理文件并仅返回感兴趣的行。

如果您打算多次这样做,那么它可以加速整个过程,将文件读取到不同的结构中,例如可以直接访问任意行的数据库,或者预先索引行以便您可以直接将seek转换为适当的行。

+0

非常感谢您的回复 - 非常有用。根据你所说的话,“预先对这些行进行索引,以便我可以”直接向相应的行寻求“,听起来就像我想要做的一样。唯一的问题是,我的文件在Windows系统上,文档不鼓励在这样的系统中使用Seek。在这种情况下,数据库路由可能更合适 - 您能否提供关于如何将此文件作为数据库存储的任何参考? – user1353889

+1

@ user1353889,'sqldf'包有一个函数'read.csv.sql'。我相信在其他一些数据库包中也有类似的功能。 –

+0

非常感谢 - 将进行调查。为了其他人在未来阅读这个问题,您是否也可以简单地谈谈如何按照您所描述的方式预先将索引用于查找? – user1353889