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

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

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

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Q&A

2回答

1353閲覧

Go 多重ループの解消方法について教えてください

rera

総合スコア109

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

0グッド

1クリップ

投稿2018/04/19 12:53

下記のようなコードで、2重ループが発生しており、ここの処理がとても遅いです。
mm.S3Objects には大体6000個、mm.Photosには14,000個ぐらいの要素が入っています。

2重ループを高速化する方法をご存知の方がいましたらご教授頂けないでしょうか。

Golang

1for _, v := range mm.S3Keys { 2 wg.Add(1) 3 4 go func(s3Key string) { 5 defer wg.Done() 6 7 for _, vv := range mm.Photos { 8 rep := regexp.MustCompile(`/`) 9 result := rep.Split(s3OKey, -1) 10 userID := result[0] 11 12 rep = regexp.MustCompile(`.`) 13 result = rep.Split(s3Key, -1) 14 fileExt := result[1] 15 tmp := result[0] 16 17 rep = regexp.MustCompile(`/`) 18 result = rep.Split(tmp, -1) 19 fileName := result[1] 20 21 if fileName == vv.FileName { 22 mm.TargetPhotos = append(mm.TargetPhotos, TargetPhoto{UserID: userID, FileName: fileName, FileExt: fileExt}) 23 } 24 } 25 }(v) 26 } 27 wg.Wait()

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

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

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

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

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

guest

回答2

0

ざっとみるかぎり、mm.S3Objects とmm.Photosで同じfilenamaのものを見つけ出してappend処理をしているコードですね。
だとしたら、二重ループで全組み合わせを調べるのではなく、内側のforを何らかの検索で置き換えるか(当然二分探索など高速探索)、両者をfilenameの小さい順に並行的に調べるか、で一重ループにするのが正解かなぁ?

投稿2018/04/19 23:26

a_saitoh

総合スコア702

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

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

0

まずはどこがボトルネックになるかを知るためにプロファイルを取ってみてはいかがでしょうか?

参考:http://klabgames.tech.blog.jp.klab.com/archives/pprof1-cpuprofile.html
その上でプロファイルの結果を元に自分で検討するかこちらに質問してみたほうが良い回答を得られると思います。

とりあえず現状ではregexp.MustCompileをループの外側で事前に呼び出しすくらいしか思いつかないです。

投稿2018/04/19 23:11

m0a

総合スコア708

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問