回覆列表
  • 1 # 民叔程式設計大法

    Python導資料的時候,需要在一個大表上讀取很大的結果集。

    如果用傳統的方法,Python的記憶體會爆掉,傳統的讀取方式預設在記憶體裡快取下所有行然後再處理,記憶體容易溢位

    解決的方法:

    1)使用SSCursor(流式遊標),避免客戶端佔用大量記憶體。(這個cursor實際上沒有快取下來任何資料,它不會讀取所有所有到記憶體中,它的做法是從儲存塊中讀取記錄,並且一條一條返回給你。)

    2)使用迭代器而不用fetchall,即省記憶體又能很快拿到資料。

    import MySQLdb.cursors

    conn = MySQLdb.connect(host="ip地址", user="使用者名稱", passwd="密碼", db="資料庫名", port=3306,

    charset="utf8", cursorclass = MySQLdb.cursors.SSCursor)

    cur = conn.cursor()

    cur.execute("SELECT * FROM bigtable");

    row = cur.fetchone()

    while row is not None:

    do something

    row = cur.fetchone()

    cur.close()

    conn.close()

    需要注意的是,

    1、因為SSCursor是沒有快取的遊標,結果集只要沒取完,這個conn是不能再處理別的sql,包括另外生成一個cursor也不行的。

    如果需要幹別的,請另外再生成一個連線物件。

    2、 每次讀取後處理資料要快,不能超過60s,否則mysql將會斷開這次連線,也可以修改 SET NET_WRITE_TIMEOUT = xx 來增加超時間隔。

    import pandas as pd

    def read_data(file_name):

    """

    file_name:檔案地址

    """

    inputfile = open(file_name, "rb") #可開啟含有中文的地址

    data = pd.read_csv(inputfile, iterator=True)

    loop = True

    chunkSize = 1000 #一千行一塊

    chunks = []

    while loop:

    try:

    chunk = data.get_chunk(chunkSize)

    chunks.append(chunk)

    except StopIteration:

    loop = False

    print("Iteration is stopped.")

    data = pd.concat(chunks, ignore_index=True)

    #print(train.head())

    return data

  • 2 # 半葉子

    可以採用分段式來對資料進行讀取和分析,之後在進行整合。

    我舉一個簡單的例子,我要複製一個大檔案,我不能都將他們讀取到記憶體中,於是我分段式進行讀取和寫入。

    因為我也在學習python,如果未能解決您的問題,請勿見怪。

    size=100*1024*1024#單次獲取的尺寸 100*1024*1024=100MBwith open("CAD2016_64bit.zip", "rb") as paer_reasd: with open("CAD2016_64bit1.zip","ab") as paer_wirte: x=1 while True: data = paer_reasd.read(size) if not data : break paer_wirte.write(data) print("%s寫入完畢"%x) x+=1

  • 3 # 歪筆獨遊

    思路是拆分或分而治之。

    比如利用磁碟儲存做外排序。如果單臺機器磁碟空間或者運算能力不足,可以使用分散式多機運算。

    一般來說,把資料按一定規則分成多塊,利用磁碟足以滿足個人需求。這個需要根據實際需求來劃分;比如記憶體只有1g,需要從長度為2^33的整數陣列中找到最大的數,因為記憶體不足,不能直接在記憶體中完成,可以考慮“外排序”,將陣列資料存為n個檔案,從每個檔案中找出最大的數,再從各個最大的數中找出最終的最大數,如果熟悉演算法,此問題可以借用二叉堆來處理。

    簡單的處理思路,可以利用現成方案,比如能處理大資料的資料庫或框架來完成(MongoDB,Cassandra,Hbase等)。

    複雜的處理,可能需要特定演算法和各種設施的配合。

    當然,如果只是為了臨時解決問題,可以不修改程式碼,僅靠增加虛擬記憶體來簡單粗暴直接地解決問題。

  • 4 # DoItYourself

    具體要看什麼樣的資料啦,如果是大資料量的Excel資料,Python有天然的資料處理庫pandas。

    它具備Excel表的一切功能,從多表拼接,合併,查詢,替換,到資料透視表,無所不能,特別適合千萬級資料記錄的大數量的處理。

    一切順利,加油。

  • 中秋節和大豐收的關聯?
  • 小說閱讀app哪個好用?