Python 整批資料填入 MySQL

百萬到千萬行資料要填入資料庫,想起來感覺很難。

MySQL 的大量資料輸入,說明書的討論大概提出二個路線:

  1. Load data infile 命令
  2. Insert [delayed] into Table Columns values Values, Values, …, Values;

我選擇第二個方法,但不使用非同步處理。

我試著以 MySQL 環境參數 bulk_insert_buffer_size 數目為基礎,以預設值 8 MB ,將資料拼湊為每 8 MB 為一段,填入資料庫,接著發現:有些資料庫可以,但有些資料庫不行。

Python 程式遇到執行失敗的 SQL ,還是老樣子:卡著讓你看。這也是使我覺得最絕的部分, Python 做為一份程式語言,所寫出來的程式可以執行在一半的時候停著不動。我猜都是因為它在 client-server 情境中,身為代理人,在提出請求之後除了進入等待的狀態以外,也不能想任何辦法給自己解除狀況。

那麼,使用了 pymysql 執行 SQL ,卻卡住了,怎麼辦呢?

真相是,要按照另一個環境參數,叫 max_allowed_packet ,來衡量一次送出多少長度的 SQL 。

MySQL 有三個參數,對於系統的容受能力,為不同的控制因素:

  1. max_allowed_packet :一次能處理的 SQL 文字長度,這是介面的控因。
  2. bulk_insert_buffer_size :屬於大量資料填入的演算法的控因。
  3. key_buffer_size :是處理表格欄位索引的演算法的控因。
廣告

About 黃耀賢 (Yau-Hsien Huang)

熱愛 Erlang ,並且有相關工作經驗。喜歡程式語言。喜歡邏輯。目前用 Python 工作。
本篇發表於 Uncategorized。將永久鏈結加入書籤。