簡體   English   中英

使用 mysql 加載數據 infile 處理大型 csv 文件

[英]Process large csv file using mysql load data infile

我正在嘗試讀取具有 500k 行和 81 列的 CSV 文件並將其插入到數據庫中。 CSV 大小為 160 MB。 我必須每 3-4 小時處理一次。 每 3-4 小時,我就會有一個新的 CSV 文件,其中包含一些新記錄和一些現有記錄。 為此,我遵循了許多方法,但沒有任何方法可以完美運行。

方法一:讀取所有記錄,但耗時過長。 讀取20萬條記錄耗時1個多小時,然后超時。

$file    = fopen($path, 'r');
while (($line = fgetcsv($file)) !== FALSE) {
}

作為解決方案:我可以增加php限制,執行時間和內存限制來避免這個錯誤,但我覺得它很慢。

方法二:

$query = "LOAD DATA LOCAL INFILE products.csv INTO TABLE tmp_tbl LINES TERMINATED BY '\\r\\n' FIELDS TERMINATED BY ',' IGNORE 1 LINES";

DB::select($query);

它給出了以下錯誤。

SQLSTATE[42000]:語法錯誤或訪問沖突:1064 你的 SQL 語法有錯誤; 檢查與您的 MariaDB 服務器版本相對應的手冊,了解在第 1 行的“FIELDS TERMINATED BY”、“IGNORE 1 LINES”附近使用的正確語法(SQL: LOAD DATA LOCAL INFILE 'products.csv' INTO TABLE tmp_tbl LINES TERMINATED BY ' \\r\\n' 字段以 ',' 結尾,忽略 1 行)

方法三:

$query = "LOAD DATA LOCAL INFILE 'products.csv' INTO TABLE tmp_tbl LINES TERMINATED BY '\\r\\n' FIELDS TERMINATED BY ',' IGNORE 1 LINES";

DB::connection()->getpdo()->exec($query);

或者

$query = "LOAD DATA LOCAL INFILE '".$file_path."' INTO TABLE tmp_tbl LINES TERMINATED BY '\\n' FIELDS TERMINATED BY ',' IGNORE 1 LINES";

DB::connection()->getpdo()->exec($query);

出現以下錯誤

SQLSTATE[42000]:語法錯誤或訪問沖突:1064 你的 SQL 語法有錯誤; 檢查與您的 MariaDB 服務器版本相對應的手冊,了解在第 1 行的“FIELDS TERMINATED BY”、“IGNORE 1 LINES”附近使用的正確語法

方法四

$query = "LOAD DATA LOCAL INFILE '".$file_path."' INTO TABLE tmp_tbl";

DB::connection()->getpdo()->exec($query);

出現以下錯誤

PDO::exec(): MySQL 服務器已經消失

方法五

$query = "LOAD DATA LOCAL INFILE '".$file_path."' INTO TABLE tmp_tbl";
DB::select($query);

出現以下錯誤

SQLSTATE[HY000]:一般錯誤:2014 無法執行查詢,而其他無緩沖查詢處於活動狀態。 考慮使用 PDOStatement::fetchAll()。 或者,如果您的代碼只針對 mysql 運行,您可以通過設置 PDO::MYSQL_ATTR_USE_BUFFERED_QUERY 屬性來啟用查詢緩沖。 (SQL: LOAD DATA LOCAL INFILE 'products.csv' INTO TABLE tmp_tbl)

我應該繼續使用哪種方法,為什么會出現所有這些錯誤? 我想在更短的時間內處理所有記錄而不會出現任何錯誤。

嘗試添加這個: DB::connection()->disableQueryLog(); 到腳本的頂部 - 您的內存消耗可能來自在內存中存儲查詢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM