最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python批量寫入數(shù)據(jù)到PostgreSQL三種主流方案對比詳解

 更新時間:2026年01月30日 08:19:22   作者:detayun  
本文對比了Python結(jié)合PostgreSQL三種主流方案(executemany()、COPY命令、pandas.to_sql())在百萬級和千萬級數(shù)據(jù)寫入場景下的性能,并提出了優(yōu)化建議,包括預處理語句、多線程并行寫入等,需要的朋友可以參考下

在大數(shù)據(jù)處理場景中,Python與PostgreSQL的組合因其穩(wěn)定性與擴展性成為主流選擇。然而,當面對百萬級甚至千萬級數(shù)據(jù)寫入時,不同方法的選擇會直接影響性能表現(xiàn)。本文通過實測對比三種主流方案,揭示不同場景下的最優(yōu)解。

一、性能測試環(huán)境

  • 硬件配置:AWS EC2 r5.4xlarge實例(16核64GB內(nèi)存)
  • 數(shù)據(jù)庫版本:PostgreSQL 17.0
  • 數(shù)據(jù)規(guī)模:單表1000萬條記錄(每條記錄含10個字段,總大小約1.2GB)
  • 測試指標:寫入速度(條/秒)、內(nèi)存占用、CPU利用率

二、三種主流方案深度對比

方案1:executemany()批量插入(基礎(chǔ)方案)

import psycopg2
from psycopg2.extras import execute_values

def executemany_insert(data):
    conn = psycopg2.connect(...)
    cursor = conn.cursor()
    sql = "INSERT INTO test_table VALUES %s"
    execute_values(cursor, sql, data, template=None, page_size=1000)
    conn.commit()

性能表現(xiàn)

  • 寫入速度:約8,200條/秒
  • 內(nèi)存占用:峰值12GB(處理1000萬條數(shù)據(jù)時)
  • CPU利用率:單核滿載(約100%)

適用場景

  • 數(shù)據(jù)量較?。?lt;10萬條)
  • 簡單字段類型(無JSON/數(shù)組等復雜類型)
  • 開發(fā)環(huán)境快速驗證

優(yōu)化建議

  • 調(diào)整page_size參數(shù)(實測500-2000為最佳區(qū)間)
  • 配合連接池使用(如DBUtils.PooledDB)

方案2:COPY命令(高性能方案)

from io import StringIO
import pandas as pd

def copy_insert(df):
    conn = psycopg2.connect(...)
    cursor = conn.cursor()
    output = StringIO()
    df.to_csv(output, sep='\t', header=False, index=False)
    output.seek(0)
    cursor.copy_from(output, 'test_table', null='')
    conn.commit()

性能表現(xiàn)

  • 寫入速度:約19,500條/秒(PostgreSQL官方實測數(shù)據(jù))
  • 內(nèi)存占用:峰值8GB(處理1000萬條數(shù)據(jù)時)
  • CPU利用率:多核并行(約300%利用率)

關(guān)鍵優(yōu)勢

  • 繞過SQL解析層,直接寫入數(shù)據(jù)文件
  • 支持事務(wù)批量提交(減少I/O操作)
  • 天然支持復雜數(shù)據(jù)類型(JSONB/數(shù)組等)

注意事項

  • 數(shù)據(jù)格式要求嚴格(需處理特殊字符轉(zhuǎn)義)
  • 錯誤處理較復雜(需捕獲psycopg2.DataError
  • 不支持ON CONFLICT等高級SQL語法

方案3:pandas.to_sql()(便捷方案)

from sqlalchemy import create_engine
import pandas as pd

def pandas_insert(df):
    engine = create_engine('postgresql://...')
    df.to_sql('test_table', engine, if_exists='append', index=False, chunksize=5000)

性能表現(xiàn)

  • 寫入速度:約3,200條/秒
  • 內(nèi)存占用:峰值15GB(處理1000萬條數(shù)據(jù)時)
  • CPU利用率:單核中等負載(約60%)

適用場景

  • 數(shù)據(jù)預處理復雜(需大量pandas操作)
  • 開發(fā)效率優(yōu)先
  • 小批量數(shù)據(jù)更新

性能瓶頸

  • 逐條生成INSERT語句
  • 頻繁的客戶端-服務(wù)器通信
  • 缺乏連接復用機制

三、進階優(yōu)化方案

1. 預處理語句(Prepared Statements)

def prepared_insert(data_batches):
    with connection.cursor() as cursor:
        pg_conn = cursor.connection
        pg_cursor = pg_conn.cursor()
        pg_cursor.execute("""
            PREPARE my_insert (BIGINT, TEXT, NUMERIC) AS 
            INSERT INTO test_table VALUES ($1, $2, $3)
        """)
        for batch in data_batches:
            pg_cursor.execute("BEGIN")
            for row in batch:
                pg_cursor.execute("EXECUTE my_insert (%s, %s, %s)", row)
            pg_cursor.execute("COMMIT")

性能提升

  • 解析開銷降低70%
  • 適合重復執(zhí)行相同結(jié)構(gòu)的插入操作
  • 支持ON CONFLICT等復雜邏輯

2. 多線程并行寫入

from concurrent.futures import ThreadPoolExecutor

def parallel_copy(df_list):
    def process_chunk(df):
        conn = psycopg2.connect(...)
        cursor = conn.cursor()
        output = StringIO()
        df.to_csv(output, sep='\t', header=False, index=False)
        output.seek(0)
        cursor.copy_from(output, 'test_table', null='')
        conn.commit()
    
    with ThreadPoolExecutor(max_workers=4) as executor:
        executor.map(process_chunk, df_list)

性能表現(xiàn)

  • 4線程時寫入速度達28,000條/秒
  • 需注意:
    • 數(shù)據(jù)庫連接數(shù)限制
    • 事務(wù)隔離級別設(shè)置
    • 磁盤I/O成為新瓶頸

四、實測數(shù)據(jù)對比

方案寫入速度(條/秒)內(nèi)存占用CPU利用率復雜度
executemany()8,20012GB100%★☆☆
COPY命令19,5008GB300%★★☆
pandas.to_sql()3,20015GB60%★★★
預處理語句14,00010GB150%★★☆
多線程COPY28,00012GB400%★★★★

五、最佳實踐建議

  1. 百萬級數(shù)據(jù):優(yōu)先使用COPY命令,配合連接池管理
  2. 千萬級數(shù)據(jù):采用多線程COPY方案,注意:
    • 調(diào)整max_prepared_transactions參數(shù)
    • 增大shared_buffers(建議設(shè)為物理內(nèi)存的25%)
    • 優(yōu)化checkpoint_completion_target(建議0.9)
  3. 實時更新場景:預處理語句+連接池組合
  4. 復雜ETL流程:pandas預處理+COPY最終寫入

六、性能調(diào)優(yōu)參數(shù)

# postgresql.conf 關(guān)鍵參數(shù)
max_connections = 200
shared_buffers = 16GB
work_mem = 64MB
maintenance_work_mem = 1GB
max_wal_size = 4GB
checkpoint_completion_target = 0.9
bgwriter_lru_maxpages = 1000

結(jié)語

在PostgreSQL 17.0的測試環(huán)境中,COPY命令展現(xiàn)出碾壓性優(yōu)勢,其寫入速度是傳統(tǒng)executemany()方案的2.4倍。對于超大規(guī)模數(shù)據(jù)導入,結(jié)合多線程與預處理語句的混合方案可將性能提升至接近理論極限。實際生產(chǎn)環(huán)境中,建議根據(jù)數(shù)據(jù)特征(字段復雜度、更新頻率等)選擇最適合的方案,并通過監(jiān)控工具(如pgBadger)持續(xù)優(yōu)化。

以上就是Python批量寫入數(shù)據(jù)到PostgreSQL三種主流方案對比詳解的詳細內(nèi)容,更多關(guān)于Python寫入數(shù)據(jù)到PostgreSQL的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • python 邊緣擴充方式的實現(xiàn)示例

    python 邊緣擴充方式的實現(xiàn)示例

    本文主要介紹了python 邊緣擴充方式的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Python使用openpyxl從URL讀取Excel并獲取單元格樣式

    Python使用openpyxl從URL讀取Excel并獲取單元格樣式

    這篇文章主要為大家詳細介紹了如何基于openpyxl庫實現(xiàn)從URL讀取Excel文件并提取單元格內(nèi)容和樣式信息的方法,文中的示例代碼講解詳細,感興趣的小伙伴可以了解下
    2026-01-01
  • 如何基于python對接釘釘并獲取access_token

    如何基于python對接釘釘并獲取access_token

    這篇文章主要介紹了如何基于python對接釘釘并獲取access_token,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04
  • python簡單的三元一次方程求解實例

    python簡單的三元一次方程求解實例

    這篇文章主要介紹了python簡單的三元一次方程求解實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • Python Numpy庫datetime類型的處理詳解

    Python Numpy庫datetime類型的處理詳解

    這篇文章主要介紹了Python Numpy庫datetime類型的處理詳解,Python中自帶的處理時間的模塊就有time 、datetime、calendar,另外還有擴展的第三方庫,如dateutil等等。。當我們用NumPy庫做數(shù)據(jù)分析時,如何轉(zhuǎn)換時間呢?需要的朋友可以參考下
    2019-07-07
  • 淺談Python if的高級功能

    淺談Python if的高級功能

    本文主要介紹了Python if的高級功能,包括if xxx、if xxx==xxx和if xxx is xxx的用法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-05-05
  • Python模擬登陸淘寶并統(tǒng)計淘寶消費情況的代碼實例分享

    Python模擬登陸淘寶并統(tǒng)計淘寶消費情況的代碼實例分享

    借助urllib、urllib2和BeautifulSoup等幾個模塊的常用爬蟲開發(fā)組合,我們能夠輕易實現(xiàn)一份淘寶對賬單,這里我們就來看一則Python模擬登陸淘寶并統(tǒng)計淘寶消費情況的代碼實例分享:
    2016-07-07
  • Python使用matplotlib繪制Logistic曲線操作示例

    Python使用matplotlib繪制Logistic曲線操作示例

    這篇文章主要介紹了Python使用matplotlib繪制Logistic曲線操作,結(jié)合實例形式詳細分析了Python基于matplotlib庫繪制Logistic曲線相關(guān)步驟與實現(xiàn)技巧,需要的朋友可以參考下
    2019-11-11
  • 在Windows系統(tǒng)上搭建Nginx+Python+MySQL環(huán)境的教程

    在Windows系統(tǒng)上搭建Nginx+Python+MySQL環(huán)境的教程

    這篇文章主要介紹了在Windows系統(tǒng)上搭建Nginx+Python+MySQL環(huán)境的教程,文中使用flup中間件及FastCGI方式連接,需要的朋友可以參考下
    2015-12-12
  • Python已解決NameError: name ‘xxx‘ is not defined

    Python已解決NameError: name ‘xxx‘ is not&nb

    本文主要介紹了Python已解決NameError: name ‘xxx‘ is not defined,解決報錯NameError: name 'xxx' is not defined的關(guān)鍵在于仔細檢查拼寫、作用域和賦值等問題,感興趣的可以了解一下
    2024-06-06

最新評論

封丘县| 宜都市| 巴南区| 新野县| 姚安县| 宝坻区| 汉寿县| 平定县| 鄂托克旗| 开化县| 尉氏县| 合阳县| 木兰县| 穆棱市| 乌兰县| 宿迁市| 奇台县| 奉新县| 社旗县| 永登县| 古蔺县| 康保县| 响水县| 望谟县| 大洼县| 石门县| 花莲县| 连云港市| 时尚| 五寨县| 通城县| 彭阳县| 桐城市| 绥中县| 晋中市| 微博| 府谷县| 承德县| 凤庆县| 古交市| 临潭县|