Skip to main content
 首页 » 编程设计

python之从 pandas 或 dask 中的数据库表中读取大数据

2024年12月31日28dyllove98

我想将包含 10+ gb 数据的表中的所有数据读取到数据框中。当我尝试使用 read_sql 读取时,出现内存过载错误。我想对该数据进行一些处理并使用新数据更新表。我怎样才能有效地做到这一点。我的电脑有 26gb 的内存,但数据最大为 11gb,但我仍然遇到内存过载错误。

在 Dask 中它花费了很多时间。下面是代码。

import dateparser 
import dask.dataframe as dd 
import numpy as np 
 
df = dd.read_sql_table('fbo_xml_json_raw_data', index_col='id', uri='postgresql://postgres:passwordk@address:5432/database') 
def make_year(data): 
    if data and data.isdigit() and int(data) >= 0: 
        data = '20' + data 
    elif data and data.isdigit() and int(data) < 0: 
        data = '19' + data 
    return data 
 
def response_date(data): 
    if data and data.isdigit() and int(data[-2:]) >= 0: 
        data = data[:-2] + '20' + data[-2:] 
    elif data and data.isdigit() and int(data[-2:]) < 0: 
        data = data[:-2] + '19' + data[-2:] 
    if data and dateparser.parse(data): 
        return dateparser.parse(data).date().strftime('%Y-%m-%d') 
 
def parse_date(data): 
    if data and dateparser.parse(data): 
        return dateparser.parse(data).date().strftime('%Y-%m-%d') 
 
df.ARCHDATE = df.ARCHDATE.apply(parse_date) 
df.YEAR = df.YEAR.apply(make_year) 
df.DATE = df.DATE + df.YEAR 
df.DATE = df.DATE.apply(parse_date) 
df.RESPDATE = df.RESPDATE.apply(response_date) 

请您参考如下方法:

参见此处:https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_sql.html

看到 chunksize 参数了吗?您可以将数据分块以适合内存。

它将返回一个 block 读取对象,因此您可以在 block 上迭代地应用操作。

您也可以合并 multiprocessing。

这将增加一层复杂性,因为您不再处理 DataFrame 本身,而是处理包含 block 的对象。

由于您使用的是 Dask,因此“应该”适用。我不确定 Dask 如何处理分块。我已经有一段时间没有接触 Pandas/Dask 兼容性了。