[BioC] advice on Biostrings
Rafael A Irizarry
ririzarr at jhsph.edu
Thu Feb 23 15:04:04 CET 2006
thanks everybody. this made it much faster:
tmpseq <- DNAString(pmseq)
GC <- DNAString("GC")
CG <- DNAString("CG")
tmp <- sapply(1:length(tmpseq),function(i){
y=tmpseq[i]
c(alphabetFrequency(y)[2:5],
length(matchDNAPattern(GC,y)),
length(matchDNAPattern(CG,y)))
})
Martin Morgan wrote:
>Actually, this function in Biostrings uses one of those fiendishly
>clever algorithms coded in C, and as a consequence is *very* fast: on
>my puny windows laptop, searching a random sequence of 10 million bp
>for "GC" returns more than 1/2 million matches in about a 10th of a
>second:
>
>
>
>>seq <- paste( dna[ runif( 10000000, min=1, max=5 )], collapse="" )
>>system.time( res <- length(matchDNAPattern( "GC", seq ))); res
>>
>>
>[1] 0.13 0.00 0.12 NA NA
>[1] 626393
>
>Maybe your speed issues are related to R, or to memory management, or
>'user error' ;) ?. Here are suggestions:
>
>* If the match pattern "GC" is a character, it is converted to a
>DNAString by matchDNAPattern. Short-circuit this step by
>
>GC <- DNAString("GC")
>
>outside the sapply, and then
>
>matchDNAPattern( GC, y )
>
>This seems to actually make quite a bit of difference:
>
>
>
>>seqs <- lapply( 1:1000, function(i) paste( dna[ runif( 100, min=1, max=5 )], collapse="" ))
>>system.time( res <- sapply( seqs, function(s) length(matchDNAPattern( "GC", s ))))
>>
>>
>[1] 27.52 0.01 27.61 NA NA
>
>
>>GC <- DNAString("GC")
>>system.time( res <- sapply( seqs, function(s) length(matchDNAPattern( GC, s ))))
>>
>>
>[1] 16.53 0.00 16.56 NA NA
>
>
>
>* Make sure your function is actually doing what you want. My mistake
>in exploring this was to write
>
>
>
>>seq <- paste( dna[ runif( 10000000, min=1, max=5 )])
>>
>>
>
>(i.e., without the 'collapse' argument). this (tried to) create a
>vector with 10 million single characters. The sapply would then have
>looped over these, rather than the single string I intended!
>
>* Do the calculations in parallel
>
>
>
>>library(snow)
>>cl <- makeCluster(4, "MPI")
>>clusterEvalQ(cl, library(Biostrings))
>>system.time(res <- parSapply( cl, seqs, function(s) length(matchDNAPattern( GC, s ))))
>>
>>
>[1] 0.01 0.00 4.56 0.00 0.00
>
>!
>
>* Perhaps your R is spending a lot of time swapping virtual memory to
>disk. Try garbage collection
>
>gc()
>
>before performing the analysis. If this doesn't halp, and it seems
>like memory really is an issue, then perhaps reading the strings in a
>chunk at a time would be necessary. You might alos try separating the
>sapply into three separate calls, one for each function. I doubt this
>is really a problem, unless you're dealing with *very* large
>collections of sequence.
>
>* I found that analyzing some number of bp in a few strings is much
>faster than analyzing the same total number of bp in many strings,
>i.e., the bottleneck is actually in sapply. There are apparently
>tricks to enhancing sapply speed, though my exploration in the present
>context didn't provide any dramatic results.
>
>Hope these suggestions help...
>
>Martin
>
>Wolfgang Huber <huber at ebi.ac.uk> writes:
>
>
>
>>Rafael A Irizarry wrote:
>>
>>
>>>hi im using biostrings to count base content as well as pair of bases
>>>content. im using the following sniped of code:
>>>
>>>
>>>
>>Hi Rafa,
>>
>>to count symbols in character vectors, matchprobes:basecontent is fast:
>>
>>library(matchprobes)
>>v = c("AAACT", "GGGTT", "ggAtT")
>>bc = basecontent(v)
>>print.default(bc)
>>bc[,"C"]+bc[,"G"]
>>
>>and if there is interest I'd be happy amend the C code to also count
>>pairs of bases (or you could, it is not terribly complicated).
>>
>> Cheers
>> Wolfgang
>>
>>
>>
>>>###pmseq is a vector of character strings (not of the same nchar).
>>>tmp <- sapply(pmseq,function(x){
>>> y = DNAString(x)
>>> c(alphabetFrequency(y)[2:5], ##count A,T,G,C
>>> length(matchDNAPattern("GC",y))+length(matchDNAPattern("CG",y)))
>>>##count GC or CG
>>>})
>>>
>>>it is painfully slow. strsplit and grep were much faster for the first
>>>part (counting bases) but the using grep for the second part was not
>>>straight forward.
>>>
>>>any suggestions?
>>>
>>>
>>-------------------------------------
>>Wolfgang Huber
>>European Bioinformatics Institute
>>European Molecular Biology Laboratory
>>Cambridge CB10 1SD
>>England
>>Phone: +44 1223 494642
>>Fax: +44 1223 494486
>>Http: www.ebi.ac.uk/huber
>>
>>_______________________________________________
>>Bioconductor mailing list
>>Bioconductor at stat.math.ethz.ch
>>https://stat.ethz.ch/mailman/listinfo/bioconductor
>>
>>
>
>
>
More information about the Bioconductor
mailing list