0

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')
4

1 に答える 1

0

これにより、パイプ間のデータがスペースなしで抽出され、その情報が新しいファイルにダンプされます。文字列を含む行のみを書き出し'LINEINDEX'、パイプ間の値がすべてスペースの場合は無視されます。パイプ間の空の値を保持する必要がある場合はif x.replace(' ','')、リスト内包表記から if 句 ( ) を削除します。

with open('/path/to/in_file.csv', 'r') as fp:
    with open('/path/to/out_file.csv', 'w') as fp2:
        for line in fp:
            if 'LINEINDEX' in line:
                out = [x.replace(' ','') for x in line.strip().split('|')
                       if x.replace(' ','')]
                fp2.write(','.join(out)+'\n')

ファイル全体をメモリにロードするのではなく、各ファイルを一度に 1 つずつ読み書きするため、メモリの問題は発生しません。

于 2016-12-09T15:36:54.043 に答える