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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

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

Q&A

5回答

3485閲覧

Pythoの容量の大きいファイルをfor文で実行するのにとても時間がかかる

gymgym

総合スコア97

Python 3.x

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

0グッド

0クリップ

投稿2019/02/01 09:21

test.csv

1#test.csvの一部 2 3 create_at \ 40 Sun Jul 22 07:23:39 +0000 2018 51 Sun Jul 22 04:44:03 +0000 2018 62 Sat Jul 21 15:28:48 +0000 2018 7 8 tweet \ 90 あげみー! https://t.co/pqbYn2wf08 101 本日ラジオ。ジ日オラ本。 112 海賊王になるのは誰だ。。。 https://t.co/6idYoGEZD5 12

日付が月曜、火曜、水曜、木曜のtweetだけ抽出してcsvに保存したいと考えています。
しかし、test.csvの容量が5GBあるためか、実行から4日ほど経過してもいまだに実行中のままです。

ソースコード上で工夫したらよい点とかあるでしょうか。

アドバイスよろしくお願い致します

Python

1tweet_df = pd.read_csv('./test.csv', encoding='utf-8', names=('create_at', 'tweet'), engine='c') 2train_df = pd.DataFrame( columns=['create_at', 'tweet'] ) 3 4for i in range(tweet_df['tweet'].shape[0]): 5    if 'Mon' in str(tweet_df['create_at'][i]) or 'Tue' in str(tweet_df['create_at'][i]) or 'Wed' in str(tweet_df['create_at'][i]) or 'Thu' in str(tweet_df['create_at'][i]): 6 tmp = pd.Series([tweet_df['create_at'][i], tweet_df['tweet'][i]], index=train_df.columns) 7 train_df = train_df.append(tmp, ignore_index=True) 8 9train_df.to_csv("train_df_1.21.csv") 10print(tweet_df['tweet'].shape[0])

使用しているPCについて

  • macOS High Sierra version 10.13.6
  • プロセッサ 3.2GHz Intel Core i5
  • メモリ 8GB 1600MHz DDR3

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

ファイル内容を全部変数に入れるのをやめて、1行ずつ読んで処理するように書き直せばいいと思います。

投稿2019/02/01 09:47

編集2019/02/01 13:05
otn

総合スコア84557

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

推測ですが、tweet_df と train_dfふたつ分で、合計およそ10GBがメモリ上に乗ろうとしてディスクスワップを起こしているため時間がかかっているのだと思います。

こういう場合、Pythonだけでなんとかしようとせず、ある程度の前処理を行うのがよいかと思います。
前処理大全」なんて本があるくらいです。

では、どういう作戦で行くか。

  • create_atのデータとtweetのデータを別ファイルにする
  • 月火水木に該当する行番号だけを別ファイルに出力する
  • tweetデータの該当行だけ別ファイルに出力する(ただしこの場合も一度にすべてのデータを読み込むのではなく、ファイルから一行ずつ読み込む感じにスクリプトを変更すること)

くらいかなぁと思います。

投稿2019/02/01 09:39

kazto

総合スコア7196

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ちょっと元CSVファイルのカタチが明確ではありませんが、単純なカンマ区切りで1行1ツイートで構成されたデータとして回答します。

時間がかかる原因と基本的な対応方法は他の方の回答のとおりです。
Pythonで処理するとしたら以下のような感じで時間短縮できると思います。

Python

1import re 2m = re.compile(r'(Mon|Tue|Wed|Thu)') 3 4with open('test.csv',encoding='utf-8') as fin: 5 with open('train_df_1.21.csv','w',encoding='utf-8') as fout: 6 for line in fin: 7 l = line.split(',') # create_at列を抽出 8 if len(l) > 0 and not m.search(l[0]): 9 continue 10 fout.write(line)

投稿2019/02/01 10:12

can110

総合スコア38266

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

メモリに 5GB ファイル全体を読み込むのは無謀です。

対処案はいくつかあります。

1. 読み込むファイルそのものを分割して、それぞれのファイルに対して処理をして、その結果を1つにまとめる。
ファイルを分割するのは、プログラムでおこなうってもよいし、linux の split コマンドをつかってもよいかもしれません。
現在つかっている処理プログラムはそのまま流用できます。

2. ファイルを一行ずつ読み込んで、一行ごとに抽出するかを判定して、結果ファイルに書き出すようにプログラムを書き換える。

3. csv ファイルを DB に読み込ませて、処理や csv 書き出しを DB を使っておこなうようにする。
DB は 自分の PC 上で mysql や postgres などを可動させてもよいし、
Google の BigQuery などをつかうようにしてもよいです。

  • Ruby で CSV ファイルを扱う

https://www.kunihikokaneko.com/cc/rubydb/rubycsv.html

  • TSVファイルを読み込んでDBへデータを流し込む

https://qiita.com/yu-croco/items/56f0ae62e4c5914d46b5

  • ローカル データソースから BigQuery にデータを読み込む

https://cloud.google.com/bigquery/docs/loading-data-local?hl=ja

投稿2019/02/02 10:25

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

丸呑みは止めて行ごとの処理にしようという点は他の人と同意見です。
書き出すべき行の番号を先にリストアップしておき、それぞれ別ファイルに書き出すという形でコードしてみました。細部にミスがあるかもしれません。

python

1d = {"Sun":[], "Mon":[], "Tue":[], "Wed":[], "Thu":[], "Fri":[], "Sat":[]} 2fout = {"Sun":[], "Mon":[], "Tue":[], "Wed":[], "Thu":[], "Fri":[], "Sat":[]} 3 4for x in fout.keys(): 5 fout[x] = open("out_{}.txt".format(x), "w") 6 7with open("test.csv", "r") as f: 8 for txt in f: 9 cols = txt.split() 10 if len(cols)==0: 11 continue 12 elif cols[0]=="tweet": 13 break 14 else: 15 d[cols[1]].append(cols[0]) 16 17 for txt in f: 18 cols = txt.split() 19 if len(cols)==0: 20 continue 21 for x in ("Mon", "Tue", "Wed","Thu"): 22 if cols[0] in d[x]: 23 fout[x].write(txt) 24 25for f in fout: 26 f.close() 27

投稿2019/02/01 13:15

KojiDoi

総合スコア13671

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問