2013-01-17 47 views
0

我有這個巨大的(61GB)FASTQ文件,我想創建一個隨機子集,但是我無法加載到內存中。 FASTQ的問題是每四行都屬於一起,否則我只會創建一個隨機整數列表,並只將這些整數的行寫入我的子集文件。轉到一個特定的行,並閱讀Python中的接下來的幾個

到目前爲止,我有這樣的:

import random 
num = []  
while len(num) < 50000000: 
    ran = random.randint(0,27000000) 
    if (ran%4 == 0) and (ran not in num): 
     num.append(ran) 
num = sorted(num) 

fastq = open("all.fastq", "r", 4) 
subset = open("sub.fastq", "w") 
for i,line in enumerate(fastq): 
    for ran in num: 
     if ran == i: 
      subset.append(line) 

我不知道如何纔去到下一個隨機整數達到文件中下三行。有人能幫我嗎?

+0

你可以用'random.sample'替換代碼的前半部分。 – katrielalex

回答

0

你可以試試這個:

import random 
num = sorted([random.randint(0,27000000/4)*4 for i in range(50000000/4)]) 

lines_to_write = 0 
with open("all.fastq", "r") as fastq: 
    with open("sub.fastq", "w") as subset: 
     for i,line in enumerate(fastq): 
      if len(num)==0: 
       break 
      if i == num[0]: 
       num.pop(0) 
       lines_to_write = 4 
      if lines_to_write>0: 
       lines_to_write -= 1 
       subset.write(line) 
+0

你需要檢查'num'是否爲空。另外,'i = num [0]'應該是'i == num [0]' –

+0

一旦num爲空但是文件還有更多行需要迭代,是不是會停止並拋出錯誤? 啊,我沒有看到@LevLevitsky已經提到過。 –

+0

你們都是對的。我沒有嘗試就做了這段代碼,很高興你能回顧一下。現在它應該(希望)工作。 –

1
  1. Iterate over the file in chunks of four lines.
  2. Take a random sample from that iterator.

的想法是,可以從一個發電機不進行採樣的隨機接入,通過它迭代和選擇(或不)依次在每個元件。

+0

您爲鏈接文件而鏈接的示例似乎不適用於文件。 –

+0

@ Lilith-Elina [answer](http://stackoverflow.com/a/434411/398968)適合我。你有什麼問題? – katrielalex

+0

啊,對於這個答案,我有這個問題,izip_longest既不能在我的電腦上工作,也不能在我們的Linux服務器上工作。 –

相關問題