すでに提供されている可能性のあるソリューションのほとんどに基づいて、より包括的な答えを出したいと思います。また、読書プロセスに役立つ可能性のあるもう1つの潜在的な援助を指摘したいと思います。
オプション1:dtypes
「dtypes」は、read
メソッドのメモリ負荷を軽減するために使用できるかなり強力なパラメータです。これとこの答えを見てください。パンダは、デフォルトで、データのdtypeを推測しようとします。
データ構造を参照すると、保存されているすべてのデータに対して、メモリ割り当てが行われます。基本的なレベルでは、以下の値を参照してください(以下の表は、Cプログラミング言語の値を示しています)。
The maximum value of UNSIGNED CHAR = 255
The minimum value of SHORT INT = -32768
The maximum value of SHORT INT = 32767
The minimum value of INT = -2147483648
The maximum value of INT = 2147483647
The minimum value of CHAR = -128
The maximum value of CHAR = 127
The minimum value of LONG = -9223372036854775808
The maximum value of LONG = 9223372036854775807
NumPyとCタイプの一致を確認するには、このページを参照してください。
あなたが数字の整数の配列を持っているとしましょう。理論的にも実際的にも、たとえば16ビット整数型の配列を割り当てることができますが、その配列を格納するために実際に必要なメモリよりも多くのメモリを割り当てることになります。これを防ぐには、にdtype
オプションを設定しますread_csv
。実際に配列を8ビット整数(np.int8
またはnp.uint8
)に合わせることができる長整数として配列項目を保存する必要はありません。
次のdtypeマップを確認してください。
ソース:https : //pbpython.com/pandas_dtypes.html
{column:type}のようにdtype
dictsとしてpandasメソッドのパラメーターとしてパラメーターを渡すことができますread
。
import numpy as np
import pandas as pd
df_dtype = {
"column_1": int,
"column_2": str,
"column_3": np.int16,
"column_4": np.uint8,
...
"column_n": np.float32
}
df = pd.read_csv('path/to/file', dtype=df_dtype)
オプション2:チャンクで読み取る
チャンクでデータを読み取ると、メモリ内のデータの一部にアクセスでき、データに前処理を適用して、生データではなく処理されたデータを保持できます。このオプションを最初のオプションであるdtypesと組み合わせると、はるかに良いでしょう。
そのプロセスのpandasクックブックセクションを指摘したいと思います。ここで見つけることができます。そこで2つのセクションに注意してください。
オプション3:Dask
DaskはDaskのWebサイトで次のように定義されているフレームワークです。
Daskは分析に高度な並列処理を提供し、お気に入りのツールの大規模なパフォーマンスを実現します
パンダが届かない部分をカバーするために生まれました。Daskは強力なフレームワークであり、分散処理することで、より多くのデータアクセスが可能になります。
daskはデータ全体を前処理するために使用できます。Daskはチャンク部分を処理します。したがって、パンダとは異なり、処理ステップを定義してDaskに処理を任せることができます。Daskは、明示的に、compute
および/またはによってプッシュされる前に計算を適用しませんpersist
(違いについては、こちらの回答を参照してください)。
その他の援助(アイデア)
- データ用に設計されたETLフロー。生データから必要なものだけを保持します。
- まず、ETLをDaskやPySparkなどのフレームワークを使用してデータ全体に適用し、処理されたデータをエクスポートします。
- 次に、処理されたデータが全体としてメモリに収まるかどうかを確認します。
- RAMを増やすことを検討してください。
- クラウドプラットフォームでそのデータを操作することを検討してください。