sales_transactionsというデータベーステーブルに2200万行の家屋売りデータがあります。私はこの表の情報を読んで、計算を実行し、その結果を使って新しい表に項目を作成する仕事をしています。プロセスは次のようになります。現時点ではパンダの計算を最適化する
for index, row in zipcodes.iterrows(): # ~100k zipcodes
sql_string = """SELECT * from sale_transactions WHERE zipcode = '{ZIPCODE}' """
sql_query = sql_string.format(ZIPCODE=row['zipcode'])
df = pd.read_sql(sql_query, _engine)
area_stat = create_area_stats(df) # function does calculations
area_stat.save() # saves a Django model
このループの各反復は、コードが終了する数週間かかるとしていることを意味し、私のMacBook Pro(16ギガバイトRAM)に約20秒かかります。高価な部分はread_sql
行です。
これをどのように最適化できますか?私はsale_transactionsテーブル全体をメモリに読み込むことはできません。それは約5GBです。そのたびにsqlクエリを使用してWHERE句で関連する行を取得します。
パンダの最適化に関するほとんどの回答は、チャンクで読むことについて話していますが、このケースでは、10年以上の売上のように、create_area_stats
関数で計算を行っているため、すべてのデータを組み合わせてWHEREを実行する必要があります。私はEC2で町に行くことを開始しない限り、RAMの負荷のあるマシンに簡単にアクセスすることはできません。私は高価でかなりの労力がかかると心配しています。
提案をいただければ幸いです。
いたとき、列のインデックスのための機会を観察することが奨励ので、私はthis articleが有用であることが判明郵便番号にインデックスを追加します。反復ごとに異なるSQL文字列を入力するのではなく、パラメタ化クエリを使用するとパフォーマンスが向上する場合もあります。 – bgse