[英]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.