Извлекайте большие данные из базы данных MySQL с помощью блоков и сохраняйте их в виде кадра Pandas - PullRequest
0 голосов
/ 19 апреля 2020

Я хочу извлечь около 100 миллионов строк и 30 столбцов данных из базы данных SQL в фрейм данных, где я могу сортировать и фильтровать на основе определенных требований. У меня только 2 гигабайта памяти. Все заходит в тупик, хотя я использую куски. Вот мой код.

import pymysql
chunksize = 100
import pandas as pd
import pymysql.cursors
from urllib import parse```

sqlEngine = create_engine('mysql+pymysql://username:%s@localhost/db' % parse.unquote_plus('password'))
dbConnection    = sqlEngine.connect()

for chunk in pd.read_sql("select * from db.db_table", dbConnection, chunksize = chunksize):
    print(chunk)

Do somrthing with chunk(chunk is the dataframe that has all the 100 million columns )

Я уменьшил свой размер, но все еще ничего не получаю.

1 Ответ

0 голосов
/ 20 апреля 2020

Чтобы уточнить мой комментарий, что-то вроде этого.

Я предвижу, что у вас будет плохое время, пытаясь разместить 100 миллионов строк x 30 столбцов в 2 гигабайтах памяти.

df = None
for offset in itertools.count(step=chunksize):
    print("Reading chunk %d..." % offset)
    query = "select * from db.db_table order by id limit %d offset %d" % (chunksize, offset)
    chunk_df = pd.read_sql(query, dbConnection)
    if not chunk_df:  # TODO: this check might not be correct
        # No data in new chunk, so we probably have it all
        break
    if not df:
        df = chunk_df
    else:
        df = pd.concat([df, chunk_df], copy=False)

# do things with DF
...