使用 python & pandas 处理大文件

Handle big files with python & pandas

感谢阅读我的post。

我需要处理大文件,让我给你更多的上下文,我从数据库中提取一些表格,将这些表格转换为 CSV,然后,我将它们转换为 JSON。

这就是将信息发送到 BigQuery。

现在我的脚本工作正常,但我有一个问题,我提取的一些表太大了,其中一个有 14 Gb,我的问题是我的服务器内存只有 8 Gb,存在任何方式将一些整合到我的拆分或附加信息的脚本 ???

我的脚本:

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,因此您应该使用 paritions 来限制查询输出。有一些逻辑来更新分区偏移量。对于每个分区,您可以为每个分区生成一个文件。在这种情况下,您的输出将类似于 output-1.csv、output-2.csv 等

使用分区的例子:

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

作为奖励提示,请避免这样做 Select * 因为 BigQuery 是列式存储系统,提及您想要阅读的列将显着提高性能。