質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.75%

  • Python 3.x

    5278questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Pythonによるデータ加工での大容量csvの扱い

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 240

tom_drums

score 1

Pythonにてメモリに乗り切らない大容量csv(数百GB)の加工の仕方についてアドバイスをください。

処理としては単純で、各レコードを一意に特定するようなIDを新たなカラムに格納していくだけなのですが、加工対象のcsvが大容量でメモリに乗らないため、どのように処理するか悩んでおります。

加工のイメージは以下の通りです。

name, amount, date
tanaka, 1000, 20180101
satou, 1200, 20180101
suzuki, 899, 20180102

といったcsvに対して

tranID, name, amount, date
0001, tanaka, 1000, 20180101
0002, satou, 1200, 20180101
0003, suzuki, 899, 20180102

といった形式で、一意となるIDをふるイメージです。

メモリにのる量であれば、panadsを使ってdataframeでtranIDを必要レコード数分作成し、結合すればよいかと思ったのですが、
今回ファイルサイズが大きいため、1行ずつの処理などが必要と思っておりますが、
いまいちいい書き方が思いつかず、アドバイスをいただけますと幸いです。

使用している環境はPython3系になります。
よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Kunihiro_Narita

    2018/05/14 14:43

    単純にIDをふるだけなら「1行分を文字列として読む、文字列の先頭にIDを付与する、文字列を1行書く」だけで、わざわざ聞くような話でもないですよね。本当に聞きたいことはBigDataを扱うプログラムの書き方ではないですか?

    キャンセル

  • tom_drums

    2018/05/17 14:49

    仰る通りで、大目的としてはpythonでbig dataを扱う場合の処理方法を知る必要があるのが背景です。ただ、当方初学者のため、「「1行分を文字列として読む、文字列の先頭にIDを付与する、文字列を1行書く」という処理を巨大なファイルに対して実施する際の書き方に自信がなく、このような質問をさせていただきました。

    キャンセル

回答 4

checkベストアンサー

+3

これでCSVを1行ずつコピーしていくコードになるので、これを発展させれば目的の処理は達成できると思います。

from csv import reader, writer

with open("input.csv", encoding="utf-8-sig") as fin:
    with open("output.csv", "w", encoding="utf-8-sig", newline='') as fout:
        wt = writer(fout)
        for row in reader(fin):
            wt.writerow(row)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/17 14:47

    ありがとうございます。
    いただいたコードをもとに発展させてやりたい処理が実現できました。

    キャンセル

+3

python上で何らかの発展を考えているなら完全に趣旨違いとなりますが、こういう大きなファイルに対して「一行読んで処理してそのまま読み捨てる」処理だけを試みるなら、awkやperlを使ったほうが遥かにシンプルですね。

awk 'NR==1{printf("tranID,")} NR>1{printf("%04d,",NR-1)} {print}' input.csv

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/17 14:46

    ありがとうございます。
    たしかにawkやperlだと簡単そうですね。
    今回は、諸事情ありpythonで処理が必要だったため、他の方をベストアンサーにさせていただきました。

    キャンセル

0

いまいちいい書き方が思いつかず、アドバイスをいただけますと幸いです。

とりあえず一行ずつだとI/Oがしんどいので、100行とか1000行ずつ読んだら多少マシになったりしないかなぁ、と思いました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/17 14:47

    確かに一つのやり方としては、なるべく分割して処理する、がセオリーなのかな、と思いました。ありがとうございます。

    キャンセル

0

一度に扱えないサイズのBigDataを処理するための汎用的な話をしますね。

BigDataを扱うには、元となるデータを一度に処理可能な量(数十MB程度)に分割して処理を行うバッチ処理か、最小単位のデータ(1行)毎に処理を行うストリーム処理の何れかになります。

ビッグデータを処理するための環境として知られているApatch Hadoopは前者を、RDBに対するSQL文の処理などは後者の方法を使っています。

今回のように一行ずつのデータに対して処理を行う場合には、バッチ処理でもストリーム処理でも良いのですが、複数の行にまたがった計算処理を行う場合にはバッチ処理でないと難しくなります。例えば時系列にそった移動平均を計算しようとするなら、元となるデータを時系列順に並び替えなくてはなりません。ですが並び替える処理は多くのメモリを使用するため、データ量が多いと一度にはできません。こういう部分はストリーム処理では実現できず、バッチ処理になります。

またビッグデータの処理では、どのような中間データを出力するかが肝になります。移動平均を算出する場合には「順不同の元データ→各月毎のデータに分割→各月毎のデータを並び替え→月毎のデータを結合→移動平均算出」のように、何段階かのバッチ処理に分ける必要があるでしょう。この時に汎用性を考えた中間データを作成しておかないと、異なる集計を行う場合に最初からやり直すために、多くの時間がかかる事になります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.75%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python 3.x

    5278questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。