[Bioc-sig-seq] Read big fastq files in chunks

Anita Lerch anita.lerch at fmi.ch
Tue Sep 27 16:17:21 CEST 2011


On Tue, 2011-09-27 at 05:33 -0700, Martin Morgan wrote:
> On 09/27/2011 02:39 AM, Anita Lerch wrote:
> > Hi,
> > I should filter a big fastq file (HiSeq ca.>30'000'000, which does not
> > fit in memory) for low qualities e.g. to many N in the sequence.
> >
> > I plan to read the file in chunks, filter the ShortReads and write them
> > into a new file.
> > This is no problem for fasta files, see the example:
> >
> > filename<- "data/DmS2DRSC_RNA_seqs_subsample.fa"
> > eof<- FALSE
> > append<- FALSE
> > cycle<- 1L
> > while(!eof){
> >    chunk<- readFasta(filename, nrec=nrec, skip=(cycle-1)*nrec)
> >    nFilt<- nFilter(5)
> >    writeFasta(chunk[nFilt(chunk)],
> >               sprintf("%s/filtered_%s",
> >                       dirname(filename), basename(filename)),
> >               append=append)
> >    append<- TRUE
> >    cycle<- cycle + 1
> >    if(length(chunk) == 0L)
> >        eof<- TRUE
> > }
> >
> > If I try to do the same for fastq file e.g.
> >
> > filename<- "data/test_data.fq"
> > eof<- FALSE
> > mode<- "w"
> > cycle<- 1L
> > while(!eof){
> >    chunk<- readFastq(filename)
> >    nFilt<- nFilter(5)
> >    writeFastq(chunk[nFilt(chunk)],
> >               sprintf("%s/filtered_%s",
> >                       dirname(filename), basename(filename)),
> >               mode=mode)
> >    mode<- "a"
> >    cycle<- cycle + 1
> >    if(length(chunk) == 0L)
> >        eof<- TRUE
> >    }
> >
> > I facing some problems when I read the ShortReads:
> > - read.DNAStringSet ignores the quality sequence.
> > - readFastq can't read in chunks
> > - FastqSampler choose a random sample of ShortRead
> >
> > Of course I can do a workaround e.g writing my own fastq parser, but I
> > prefer a clean solution or to solve the problem.
> > So my questions, is there a clean solution I'm not aware of it?
> > If I'm right and there is this problem, what is the plan of the
> > community to solve this problem or is this already work in progress?
> > Can I help to solve this problem e.g. rewriting the readFastq()
> > function.
> 
> Hi Anita -- this needs to be added to ShortRead, and I can do so later 
> this week. But if you'd like to help, I would like to create a reference 
> class
> 
>    .FastqStreamer <- setRefClass("FastqStreamer", <...>)
> 
> a constructor
> 
>    FastqStreamer <- function(con, n=1e6..., verbose=FALSE)
> 
> and a method
> 
>    yield,FastqStreamer-method
> 
> so that streaming through a file looks like
> 
>    f <- FastqStreamer(con, n=1e6, verbose=FALSE)
>    while (length(srq <- yield(f))) {
>         ## work
>    }
> 
> I think .FastqStreamer would share some infrastructure with 
> .FastqSampler, and would take the same approach as in 
> R/methods-Sampler.R -- treat the file at the R level as a connection 
> that is input with readBin() so that R's connection interface can be 
> used, do some R-level buffering, and translate the raw() to ShortReadQ 
> objects in C (like src/sampler.c:sampler_rec_parser). Probably there is 
> some code re-factoring and a little reference class hierarchy .FastqFile 
> as parent of .FastqStreamer and .FastqSampler.

Great. I think that is the right way.
I know the reference classes, but I don't have any working experience
with them. I start with implementing and keep you informed.

Anita

-- 
Anita Lerch
Friedrich Miescher Institute
Maulbeerstrasse 66
WRO-1066.P22
4058 Basel
Phone: +41 (0)61 697 5172
Email: anita.lerch at fmi.ch



More information about the Bioc-sig-sequencing mailing list