1. 程式人生 > >億級別---資料生成及高效率匯入

億級別---資料生成及高效率匯入

引言

做這件事情之前,首先

對於mysql,首先需要改改mysql的預設儲存路徑,以免因為硬碟分割槽或者掛載容量的問題,導致資料插入不成功。

兩個解決方案:

對於mongodb,只需要改一下啟動時命令列的儲存路徑。

MYSQL

1. 建表 (僅列舉三個欄位, 實際當中為20+ 欄位)

create table device (
    id int not null auto_increment,
    deviceID char(16),
    createDate TIMESTAMP default current_timestamp,
    primary key(id)
) ENGINE=MYISAM DEFAULT CHARSET=utf8<span style="font-family: Arial, Helvetica, sans-serif; color: rgb(169, 183, 198);">;</span>

CREATE INDEX did_index ON device (deviceID) USING BTREE;

相比於預設的INNODB引擎,MYISAM(非關係型儲存)對於批量資料插入效率較高

    實際中,用python指令碼生成的資料檔案(txt) 大小為10GB左右,索引大小為1.7G左右。

mysql> LOAD DATA LOCAL INFILE '/path/device.txt' INTO TABLE device;

4. 按索引進行查詢(非索引覆蓋),普通硬碟的訪問時間5秒,SSD在0.3--0.5秒,由此看出,瓶頸在硬碟讀寫。

MONGODB

1. mongodb啟動時,關閉journal。

$ mongod --nojounal --dbpath /sandbox/mongo_data --port 27018

2. 訪問mongodb

$ mongo localhost:27018/test1

3. 匯入資料 (可以去官網查詢import的具體引數細節)

$ mongoimport --db test1 --host localhost --port 27018 --collection device --drop --type tsv --headerline --file /sandbox/device_tsv.tsv --numInsertionWorkers 8

note: 為了提高mongodb的插入效率,我們可以採用mongodb推薦的(numInsertionWorkers)多執行緒操作。本質來說,就是將insert任務,拆分成多個執行緒來做。

a. mongodb 匯入資料檔案格式不支援txt, 但是支援tsv --- 資料記錄用tab分隔的檔案格式

b. 指令碼生成的資料大小為10GB -- 11GB (device_tsv.tsv)

c. 在匯入資料前,不生成索引。在資料批量插入以後生成,可以大大提高插入效率。

d. 實際匯入資料庫後,發現指定目錄的資料儲存為218GB。 匯入時間不足一小時。

e. 但是查詢效率表現不俗,在普通硬碟上按索引查詢,在0.5秒左右。

個人感覺,所謂的資料的插入和查詢,相比較而言只不過是空間和時間的相互轉化利用。