有没有一种方法可以在R中读写内存文件?

7

我正在尝试使用R来分析大型DNA序列文件(fastq文件,每个文件几个GB),但是标准的R接口(ShortRead)必须一次性读取整个文件。这不适合内存,因此会导致错误。有没有办法可以一次读取几千行,将它们塞入内存中的文件,然后使用ShortRead从该内存文件中读取?

我需要类似Perl的IO :: Scalar的东西,用于R。


实际上,我不认为我可以用这个解决我的问题:有问题的函数(readFastq)需要一个文件名称,所以我不确定我是否可以传递任意连接。 - Ryan C. Thompson
我认为你所寻找的答案已经在这篇文章中得到了描述:https://dev59.com/_XI-5IYBdhLWcg3wsKh4#1820610 我特别喜欢sqldf解决方案。 - Roman Luštrik
4个回答

2

2

看起来ShortRead即将添加一个名为“FastqStreamer”的类,它可以做我想要的事情。


1

嗯,我不知道readFastq是否接受除文件以外的其他内容...

但是如果可以的话,在其他函数中,您可以使用R函数pipe()打开一个Unix连接,然后可以使用一些管道和Unix命令head和tail的组合来实现。

例如,要获取第90到100行,可以使用以下命令:

head file.txt -n 100 | tail -n 10

所以你可以分块读取文件。

如果必须的话,你总是可以使用这些Unix工具来创建一个临时文件,然后用shortRead读取它。虽然有点麻烦,但如果只能接受文件,至少它能够工作。


1
顺便提一下,如何在R中进行内存文件操作(类似于Perl的IO::Scalar)的一般方法是使用textConnection函数。不幸的是,ShortRead包无法处理textConnection对象作为输入,因此,虽然我在问题中表达的将文件分成小块读入内存文件,然后逐位解析的想法对许多应用程序来说肯定是可行的,但对于我的特定应用程序来说却不行,因为ShortRead不喜欢textConnections。因此,解决方案是上面描述的FastqStreamer类。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接