从数据库读取时在Dask数据框中设置分区大小的问题

时间:2019-05-04 13:39:22

标签: python dask

我正在尝试从表中读取数据并将每个块的大小设置为256MB,而不指定分区和分区。但是当我检查每个分区的大小时,它小于60 MB

用于刺激问题的最小完整代码:

生成数据:

import string
import sqlite3

from itertools import permutations
def create_table(cur):    
    query = '''create table sample(id int, name text)'''
    cur.execute(query)
c = 1
def get_chunk(n, chunk_size):
    chunk = []
    global c
    for d in permutations(string.ascii_uppercase, n):
        t = c , ''.join(d)
        chunk.append(t)
        c += 1
        if len(chunk) >= chunk_size:
            yield chunk
            chunk = []
    return chunk

def insert_data(cursor, n, chunk_size): 
    for chunk in get_chunk(n, chunk_size):
        cur.executemany('insert into sample values (?, ?)', chunk)
conn = sqlite3.connect('test.db')
cur = conn.cursor()
create_table(cur)
conn.commit()
insert_data(cur, 6, 1000)
conn.commit()

用于处理

import dask.dataframe as dd
df = dd.read_sql_table('sample', 'sqlite:////path/to/test.db', 'id', bytes_per_chunk=268435456)
def fun(df):
    print(df.name.count())
    print(df.info())
df.map_partitions(fun).compute()

1 个答案:

答案 0 :(得分:1)

dd.read_sql_table猜测在不提供更多信息的情况下,如何仅基于前head_rows行进行划分(默认为五行)。有很多方法可能会导致此估计错误!在这种情况下,您似乎受到了不错的考虑,也许您可​​以调查造成这种情况的具体原因,但总的来说,最好提供一些更具体的信息(分区数或显式的启动/停止)限制)。如果您想进一步控制。