Python 2.7 で読み取る必要があるファイルのコレクション (1 つの ~10GB ファイルが複数のファイルに分割されるため、それぞれ約 1GB) があります。ファイル形式は次のようになります。
1|KEY1|A |B |01/01/2016| |
2|KEY1| |LINEINDEX1|C |D |E | 123.000| 456.000| 789.1250|000100000.00|000100000.70|100|01/2016| 001|100|01/2016|050|050|01|001|100|F |G |H |1|I|J | |K |L |M | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
2|KEY1| |LINEINDEX2|C |D |E | 123.000| 456.000| 789.1250|000100000.00|000100000.70|100|01/2016| 001|100|01/2016|050|050|01|001|100|F |G |H |1|I|J | |K |L |M | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
2|KEY1| |LINEINDEX3|C |D |E | 123.000| 456.000| 789.1250|000100000.00|000100000.70|100|01/2016| 001|100|01/2016|050|050|01|001|100|F |G |H |1|I|J | |K |L |M | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
2|KEY1| |LINEINDEX4|C |D |E | 123.000| 456.000| 789.1250|000100000.00|000100000.70|100|01/2016| 001|100|01/2016|050|050|01|001|100|F |G |H |1|I|J | |K |L |M | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
1|KEY2|A |B |01/01/2016| |
2|KEY2| |LINEINDEX5|C |D |E | 123.000| 456.000| 789.1250|000100000.00|000100000.70|100|01/2016| 001|100|01/2016|050|050|01|001|100|F |G |H |1|I|J | |K |L |M | | | | | | | | | | | | | | | | |1 | | | | | | | | | | | | | | | | | | | | | | |N | | | | | | | | | | | |
2|KEY2| |LINEINDEX6|C |D |E | 123.000| 456.000| 789.1250|000100000.00|000100000.70|100|01/2016| 001|100|01/2016|050|050|01|001|100|F |G |H |1|I|J | |K |L |M | | | | | | | | | | | | | | | | |4 | | | | | | | | | | | | | | | | | | | | | | |O | | | | | | | | | | | |
で始まる行は2
、一意の値に対して無期限に繰り返すことができLINEINDEX#
、次の行は1
新しいKEY
項目で始まります (独自の行が続きます2
)。2
複数の に基づくデータ型のテーブルを効率的に生成できるようにする必要があるKEY
ため、実際には行はまったく必要ありません1
。空のフィールドにデータがある場合とない場合があるため、そこにあるすべてのデータを取得する必要があります。
このデータに関連するプログラムのほとんどは Pandas を使用しているため、理想的には Pandas に固執しようとしていました。私の計画は、これらのファイルを HDF5 ファイルに解析し、必要に応じてそこからテーブルを作成することでした。それが当面の問題に対処する最善の方法であるかどうかはわかりません。そのため、代替案に関する提案は大歓迎です。現在、この処理は ffdf を介して R で行われていますが、Python に移行する必要があります。
これらのファイルを 1 行ずつ読み取ることができず (メモリ不足がほぼ即座に表示されます)、行を削除/無視します1
。これらの行を「コメント」として扱い、無視するためにPandas を試してみread_csv
ましcomment='1'
たが、他の投稿に基づいて何よりもバグのように思われる CParserError が表示されます (他の人がそのエラーについて提案したように、最初の行をスキップしようとしました、しかし、それはうまくいきませんでした)。
pandas.io.common.CParserError: Error tokenizing data. C error: Expected 4 fields in line 504, saw 14
(私が持っている) データ型を指定せずにファイルを処理すると、次のようなパフォーマンスの問題が発生します。
sys:1: DtypeWarning: Columns (21) have mixed types. Specify dtype option on import or set low_memory=False.
次に、 を変換するto_hdf
と、同様のパフォーマンスの問題が発生します。
C:\Python27\lib\site-packages\pandas\core\generic.py:1138: PerformanceWarning:
your performance may suffer as PyTables will pickle object types that it cannot map directly to c-types
一緒に始まる行を無視するか、行1
ごとに作業しようとするたびにメモリ不足になることなく、2 つの異なる dType マップを何らかの方法で指定する最良の方法は何ですか? 2
のリストに基づいて明細項目を照会するために、このデータを保存するより良い方法はありますKEY
か?
今のところ、コードは単純です:
for input_file in os.listdir(input_path):
file_path = input_path + '\\' + input_file
data = pd.read_csv(file_path, sep='|')
data.to_hdf(self.outputs_path + '\converted.h5', 'converted_table')