我需要處理存盤在 S3 存盤桶中的數千個檔案。我的想法是啟動一堆 EC2 VMS(每個 96 個內核),并讓它們通過 python 聯系 MySQL 資料庫,以獲得它需要處理的檔案的 96 個 S3 路徑。我還想記錄它是否正在進行或已被處理并將 IN_PROGRESS AND PROCESSED 列設定為 0 或 1。我有當前陳述句,我遇到的問題是它更新了 IN_PROGRESS 值,但我不是確定如何選擇/回傳處理所需的 96 個檔案名。我無法運行 SELECT * FROM temp,運行更新后回傳錯誤。
UPDATE dev_gba.`dev-l1c` as dev
SET dev.IN_PROGRESS = 1
WHERE dev.`index` in (SELECT * FROM (SELECT `index`
FROM dev_gba.`dev-l1c`
WHERE IN_PROGRESS =0 AND PROCESSED =0
ORDER BY RAND()
LIMIT 96) temp );
我的另一個想法是使用 python 獲取 EC2 實體 ID,更新 INSTANCE_ID 列,然后使用另一個陳述句獲取具有該特定實體 ID 的行。我似乎無法弄清楚的另一個挑戰是防止其他實體選擇相同的行。如果我有 10 個實體同時查詢資料庫的 96 個隨機行,我擔心可能會有一些重疊。我想解決這個問題是在我的 python 腳本中添加一些隨機等待時間。
uj5u.com熱心網友回復:
你的問題不是很清楚你從哪里得到這些實體,所以我有點猜測。
嘗試一些這樣的 SQL 以避免競爭條件。一定要使用MySQL的InnoDB存盤引擎;MyISAM 和 AriaDB 不支持事務。
BEGIN TRANSACTION;
/* get the indexes to process */
CREATE TEMPORARY TABLE to_process
SELECT index FROM dev_gba.`dev-l1c`
WHERE IN_PROGRESS = 0
AND PROCESSED =0
ORDER BY RAND()
LIMIT 96;
/* do your update */
UPDATE dev_gba.`dev-l1c` SET IN_PROGRESS = 1
WHERE index IN (SELECT index FROM to_process);
/* retrieve the items to process */
SELECT *
FROM dev_gba.`dev-l1c`
WHERE index IN (SELECT index FROM to_process);
/* get rid of the temp table */
DROP TABLE to_process;
/* end the transaction */
COMMIT;
需要考慮的事項:AWS 虛擬機通常受 I/O 和網路限制。您可以通過使用更小、更便宜的實體以及每個實體使用更少的并發來獲得更好的吞吐量。此外,當您進行大量并發檔案或網路操作時,還有大量作業系統作業要做。至少為這項作業留下一兩個核心。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/394881.html
上一篇:用NA有條件地過濾
