Java 逐行解析 4G/4000 萬行文本入庫預估 30 天。改用 MySQL 原生 LOAD DATA INFILE 並行導入,實測 **47943428 行** 入庫,耗時數小時。本文記錄導入命令、編碼處理、超時調優、鎖等待處理全過程。
每行:主體 ||| 謂語 ||| 賓語 例:北京 ||| 是 ||| 中國首都
LOAD DATA INFILE '/home/lenovo/文檔/NLPCC2015/auxiliary-data/NLPCC-2015.Auxiliary.KB.Chinese' IGNORE INTO TABLE detail_all CHARACTER SET utf8 FIELDS TERMINATED BY ' ||| ' LINES TERMINATED BY '\n' (`subject`, `predicate`, `value`);
IGNORE:跳過主鍵/唯一鍵衝突行。CHARACTER SET utf8:指定文件編碼,避免隱式轉換。FIELDS TERMINATED BY ' ||| ':多字符分隔符精確匹配。UPDATE detail_all SET `value` = TRIM(TRAILING '\r' FROM `value`);
Windows 文本換行 \r\n,LINES TERMINATED BY '\n' 導致 \r 進入最後字段,用 TRIM(TRAILING ...) 清理。
Error Code: 2013. Lost connection to MySQL server during query (600 sec)
原因:導入耗時超過 net_read_timeout/net_write_timeout(默認 600s)。
解決:
SET GLOBAL net_read_timeout=3600; SET GLOBAL net_write_timeout=3600; -- 或 my.cnf 永久調大
Error Code: 1205. Lock wait timeout exceeded; try restarting transaction
原因:大事務持有鎖超過 innodb_lock_wait_timeout(默認 50s)。
處理:等待阻塞事務回滾完成,或調大 innodb_lock_wait_timeout,或分批導入(每批 100 萬行)。
| 方案 | 預估耗時 | 實際耗時 | 行數 |
|---|---|---|---|
| Java 逐行解析入庫 | 30 天 | 未完成 | 4000萬+ |
| LOAD DATA INFILE | 數小時 | ~3-4 小時 | 47943428 |