從大檔案中隨機抽取一定資料

2021-09-11 16:56:11 字數 1106 閱讀 8182

**:

在建模的時候,時常需要構造訓練集和測試集,但當總資料比較大的時候,如何進行簡單抽樣也是乙個問題。

假設有這樣乙個情況,乙份資料總共有1,000,000條,要從中抽取100,000條左右的資料。每條資料相對比較大,把所有資料一次放入記憶體不靠譜,那麼如何抽樣呢?

最齪的方法就是抽取頭100,000或100,000條。

第二種能想到的方法就是,構造乙個1-1,000,000的陣列,然後從裡面隨機抽取100,000個作為樣本行號列表,在讀取大檔案,一旦行號在列表中就輸出到樣本檔案中。

第二種方法基本夠用,但還是存在一定缺陷。當總資料非常大,需要抽取的樣本數也不小時,或機器記憶體較小時。於是考慮到使用概率方式,在[1-n]作均勻隨機抽取數字,那麼期望值(n+1)/2,也就是說隨機足夠多次數,那麼所有的隨機出來的數字的平均數為(n+1)/2。那麼是否可以這樣考慮,我們每隨機乙個值a,就把大檔案中中連續的a行作為乙個塊,那麼最後每個塊的平均大小為(n+1)/2,也就是說大檔案被切分成n/((n+1)/2),我們再再每一塊中取一行作為樣本。這樣的話由於大檔案的總行數n,和塊數(樣本大小)是已知的,那麼我們就可以求出n。

還是一開始的例子,可以求出n=(n/m) * 2 - 1=(1000000/100000) * 2 - 1 = 19;

於是python**:

ei=randint(1, 19);bi=0;  

fd = open('total.txt', 'r');

ofd = open('sample.txt', 'w');

while true:

line = fd.readline();

if not line:

break;

bi += 1;

if bi != ei:

continue;

ofd.write(line);

bi = 0;

ei = randint(1, 19)

ps: 我實際測試的列子是總資料條數為35385665,嘗試抽取100,000,使用上面的方法,最後抽取出100,167條記錄,基本符合要求了。不過不能精確的抽取100,000也就是這個方法的弊端了。

**:

利用一條SQL從表中抽取一定資料

利用一條sql語句從資料庫表 隨機獲取n條記錄,各資料庫的sql語句略有不同,如下 1 mysql select from table order by rand limit n 以上 效率不高,自己對1000條資料表隨機取10條的測試結果為耗時0.125s,有推薦改為以下 效率有大幅提高,耗時為0...

隨機抽取一定比例的fastq檔案

在ngs的下機資料中,我們通常抽取一定比例的fq檔案做分析。在此,筆者提供兩種方式來抽取fq資料。第一種方法速度較快,但存在一定的隨機誤差。執行方式 perl 0 fq檔案抽取比例 usr bin perl w use strict die usage perl 0 n unless argv 2 ...

shell 隨機從檔案中抽取若干行

shuf n5 main.txt sort r main.txt head 5 awk vn 5 vc wc l file begin shuf 命令的選項 e,echo 將每個引數視為輸入行 i,input range lo hi 將lo 到hi 的每個數字視為輸入行 n,head count 行...