簡體   English   中英

使用 python 和 pandas 處理大文件

[英]Handle big files with python & pandas

感謝您閱讀我的帖子。

我需要處理大文件,讓我給你更多的上下文,我從數據庫中提取一些表,將這些表轉換為 CSV,然后,我將它們轉換為 JSON。

所有這一切都是為了將信息發送到 BigQuery。

現在我的腳本工作正常,但我有一個問題,我提取的一些表太大了,其中一個有 14 Gb,我的問題是我的服務器 memory 只有 8 Gb,存在任何方式將一些集成到我的腳本中以拆分或 append資料???

我的腳本:

import pyodbc
import fileinput
import csv
import pandas as pd
import json
import os
import sys

conn = pyodbc.connect("Driver={SQL Server};"
                      "Server=TEST;"
                      "username=test;"
                      "password=12345;"
                      "Database=TEST;"
                      "Trusted_Connection=no;")
cursor = conn.cursor()

query = "SELECT * FROM placeholder where "


with open(r"D:\Test.txt") as file:
    lines = file.readlines()
    print(lines)


for user_input in lines:

    result = query.replace("placeholder", user_input)
    print(result)
    sql_query = pd.read_sql(result,conn)
    df = pd.DataFrame(sql_query)
    user_inputs =  user_input.strip("\n")
    filename = os.path.join('D:\\', user_inputs + '.csv')
    df.to_csv (filename, index = False, encoding='utf-8', sep = '~', quotechar = "`", quoting=csv.QUOTE_ALL)
    print(filename)
    filename_json = os.path.join('D:\\', user_inputs + '.jsonl')
    csvFilePath = (filename)
    jsonFilePath = (filename_json)
    print(filename_json)
    df_o = df.applymap(lambda x: x.strip() if isinstance(x, str) else x)
    df_o.to_json(filename_json, orient = "records",  lines = True, date_format = "iso", double_precision = 15, force_ascii = False, date_unit = 'ms', default_handler = str)

dir_name = "D:\\"
test = os.listdir(dir_name)

for item in test:
    if item.endswith(".csv"):
        os.remove(os.path.join(dir_name, item)) 

cursor.close()
conn.close()

我真的是 python 的新手,我希望你能幫我把一些東西整合到我的腳本中。

真的非常感謝大家!!!

親切的問候。

對於大型數據集,您應該避免一次讀取所有數據然后一次寫入所有數據。 您應該進行部分讀取和部分寫入。

由於您使用的是 BigQuery,因此您應該使用分區來限制查詢output。有一些邏輯來更新分區偏移量。 對於每個分區,您可以為每個分區生成一個文件。 在這種情況下,您的 output 將類似於 output-1.csv、output-2.csv 等。

使用分區的示例:

SELECT * FROM placeholder
WHERE transaction_date >= '2016-01-01'

作為獎勵提示,請避免執行 Select *,因為 BigQuery 是列式存儲系統,提及您想要閱讀的列將顯着提高性能。

暫無
暫無

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

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