2011-03-28 199 views
0

我在一些大的(幾百萬行)生物信息數據集工作與一般格式的大的文本文件行比較:行,用蟒蛇

chromosomeNumber locusStart locusStop sequence moreData 

我有這種格式的其他文件:

chromosomeNumber locusStart locusStop moreData 

我需要做的是將每種文件類型中的一種讀入內存,並且如果上層文件的一行的locusStart位於較低文件中任何行的開始和停止之間,則print要輸出文件1的行。如果該行的locusStart不在啓動和停止之間然後將其打印到輸出文件2.

我正在閱讀中的文件,將它們轉換爲鍵入染色體的字典並將相應的行作爲值。然後我將每個值線分成一個字符串,然後與字符串進行比較。這需要很長時間,我想知道是否有更有效的方法來做到這一點。

謝謝。

+0

這將有助於看到您的實際代碼 – dfb 2011-03-28 20:29:27

+0

老實說,我不明白什麼是指像_upper _文件和_lower _文件 – neurino 2011-03-28 20:29:46

+0

@neurino方面 - 我覺得上下指的是代碼塊的OP。 至於我想我會讀文件2第一,區間進行排序,然後運行文件1個一行一行的問題 - 這完全忽略了chromosomeNumber雖然如此,@ user680895,請澄清一下? – 2011-03-28 20:38:51

回答

0

似乎對於較低的文件(我假設它有第二種格式),您關心的唯一字段是'locusStart'。因爲,從你的描述,你不一定在意對方的數據,你可以做一個集中​​的所有locusStart的:

locusStart_list = set() 
with open(upper_file, 'r') as f: 
    for line in f: 
    tmp_list = line.strip().split() 
    locusStart_list.add(tmp_list[1]) 

這將刪除所有你的底部文件做不必要的線操縱。然後,您可以輕鬆地將字段的locusStart與從較低文件構建的集合進行比較。該集還會刪除重複項,使其比使用列表快一點。

0

這聽起來像你會做大於/小於比較,因爲我不認爲將數據加載到字典中會提高代碼的速度 - 基於你已經解釋過這聽起來像你仍然在循環遍歷一個文件或另一個文件中的每個元素。

你需要的是一個不同的數據結構來加載你的數據並運行比較操作。看看Python bisect module,我認爲它可以提供更高效地運行比較操作很多所需的數據結構。


如果你能更精確地描述你要完成什麼,我們就可以幫助您開始編寫代碼。

0

使用染色體數字字典是一個好主意,只要您可以將兩個文件放入內存。

然後您想按locusStart對兩個列表進行排序(拆分字符串,將locusStart轉換爲數字 - 如果不確定如何單獨對locusStart進行排序,請參見instructions on sorting)。

現在您可以遍歷您的列表:如果較低的locusStart小於第一個上面的locusStart,則將該行放入文件2並繼續下一個。如果下locusStart比第一上locusStart然後

  • 更大雖然它也比locusEnd更大,扔掉上面的列表中
  • 的開始。如果你發現它是大於locusStart和小於的情況下, locusEnd,把它放在文件1
  • 否則,將其放在文件2

這應該更換什麼現在可能是一個O(n^2)算法與O(n log n)之一。