2

私はまだこの膨大なURLのリストを扱っています、私が受けたすべての助けは素晴らしかったです。

現時点では、次のようなリストがあります(ただし、17000のURL)。

http://www.example.com/page?CONTENT\_ITEM\_ID=1
http://www.example.com/page?CONTENT\_ITEM\_ID=3
http://www.example.com/page? CONTENT \ _ITEM \ _ID = 2
http://www.example.com/page?CONTENT\_ITEM\_ID=1
http://www.example.com/page?CONTENT\_ITEM\_ID=2
http:// www .example.com / page?CONTENT \ _ITEM \ _ID = 3
http://www.example.com/page?CONTENT\_ITEM\_ID=3

いくつかの方法、awkなどで問題なく重複を除外で​​きます。私が本当に探しているのは、重複するURLを取得すると同時に、リストにURLが存在する回数をカウントして印刷することです。パイプ区切り文字のあるURLの横のカウント。リストを処理すると、次のようになります。

url | カウント

http://www.example.com/page?CONTENT\_ITEM\_ID=1 | 2
http://www.example.com/page?CONTENT\_ITEM\_ID=2 | 2
http://www.example.com/page?CONTENT\_ITEM\_ID=3 | 3

これを達成するための最速の方法はどの方法ですか?

4

5 に答える 5

5

これはおそらく、コードを記述せずに取得できるのと同じくらい高速です。

    $ cat foo.txt
    http://www.domain.com/page?CONTENT_ITEM_ID=1
    http://www.domain.com/page?CONTENT_ITEM_ID=3
    http://www.domain.com/page?CONTENT_ITEM_ID=2
    http://www.domain.com/page?CONTENT_ITEM_ID=1
    http://www.domain.com/page?CONTENT_ITEM_ID=2
    http://www.domain.com/page?CONTENT_ITEM_ID=3
    http://www.domain.com/page?CONTENT_ITEM_ID=3
    $ sort foo.txt | uniq -c
          2 http://www.domain.com/page?CONTENT_ITEM_ID=1
          2 http://www.domain.com/page?CONTENT_ITEM_ID=2
          3 http://www.domain.com/page?CONTENT_ITEM_ID=3

少しテストを行いましたが、特に高速ではありませんが、17kの場合は1秒強かかります(ロードされたP4 2.8Ghzマシンの場合)

$ wc -l foo.txt
174955 foo.txt
vinko @ mithril:〜/ i3media / 2008 / product / Pending $ time sort foo.txt | uniq -c
  54482 http://www.domain.com/page?CONTENT_ITEM_ID=1
  48212 http://www.domain.com/page?CONTENT_ITEM_ID=2
  72261 http://www.domain.com/page?CONTENT_ITEM_ID=3

実数0分23.534秒
ユーザー0m16.817s
sys 0m0.084s

$ wc -l foo.txt
14955 foo.txt
$ time sort foo.txt | uniq -c
   4233 http://www.domain.com/page?CONTENT_ITEM_ID=1
   4290 http://www.domain.com/page?CONTENT_ITEM_ID=2
   6432 http://www.domain.com/page?CONTENT_ITEM_ID=3

実数0分1.349秒
ユーザー0m1.216s
sys 0m0.012s

いつものように、O()はゲームハンドダウンに勝ちますが。S.Lottのソリューションをテストし、

$ cat pythoncount.py
コレクションからimportdefaultdict
myFile = open( "foo.txt"、 "ru")
fq = defaultdict(int)
myFileのnの場合:
    fq [n] + = 1
fq.items()のnの場合:
    print "%s |%s"%(n [0] .strip()、n [1])

$ wc -l foo.txt
14955 foo.txt

$ time python pythoncount.py
http://www.domain.com/page?CONTENT_ITEM_ID=2 | 4290
http://www.domain.com/page?CONTENT_ITEM_ID=1 | 4233
http://www.domain.com/page?CONTENT_ITEM_ID=3 | 6432

実数0m0.072s
ユーザー0m0.028s
sys 0m0.012s

$ wc -l foo.txt
1778955 foo.txt

$ time python pythoncount.py
http://www.domain.com/page?CONTENT_ITEM_ID=2 | 504762
http://www.domain.com/page?CONTENT_ITEM_ID=1 | 517557
http://www.domain.com/page?CONTENT_ITEM_ID=3 | 756636

実数0分2.718秒
ユーザー0m2.440s
sys 0m0.072s
于 2008-11-05T12:00:40.347 に答える
4

これを何度も繰り返すつもりですか?そうでない場合、実装が最も速いのと同じように「最速」がおそらく

sort </file/of/urls | uniq --count | awk '{ print $2, " | ", $1}'

(テストされていません。私は UNIX コマンド ラインの近くにいません)

于 2008-11-05T13:37:05.270 に答える
3

Perlで

[免責事項:現時点ではこのコードをテストできません]

while (<>) {
    chomp;
    $occurences{$_}++;
}
foreach $url (sort keys %occurences) {
    printf "%s|%d\n", $url, $occurences{$url};
}
于 2008-11-05T12:15:26.603 に答える
2

タプルのリストをPythonでdictに変換するを参照してください。

基本的に、リストの代わりにintを使用して同じことを行っています。

これはO(n)であるため、システムソートよりも高速である可能性があります。ただし、これもPythonであり、Cではありません。

from collections import defaultdict
myFile = open( "urlFile", "ru" )
fq= defaultdict( int )
for n in myFile:
    fq[n] += 1

for url, count in fq.iteritems():
    print url.rstrip(), "|", count

私の小さなDellD830では、これは0.015秒で17000のURLを処理します。

于 2008-11-05T12:03:15.817 に答える
1

Python の別のバージョンを次に示します。

import fileinput, itertools

urls = sorted(fileinput.input())
for url, sameurls in itertools.groupby(urls):
    print url.rstrip(), "|", sum(1 for _ in sameurls)

例:

$ cat foo.txt
http://www.domain.com/page?CONTENT_ITEM_ID=1
http://www.domain.com/page?CONTENT_ITEM_ID=3
http://www.domain.com/page?CONTENT_ITEM_ID=2
http://www.domain.com/page?CONTENT_ITEM_ID=1
http://www.domain.com/page?CONTENT_ITEM_ID=2
http://www.domain.com/page?CONTENT_ITEM_ID=3
http://www.domain.com/page?CONTENT_ITEM_ID=3

$ python countuniq.py foo.txt
http://www.domain.com/page?CONTENT_ITEM_ID=1 | 2
http://www.domain.com/page?CONTENT_ITEM_ID=2 | 2
http://www.domain.com/page?CONTENT_ITEM_ID=3 | 3

パフォーマンス:

C:\> timethis "sort urls17000.txt|uniq -c"
...
TimeThis :  Elapsed Time :  00:00:00.688

C:\> timethis python countuniq.py urls17000.txt
...
TimeThis :  Elapsed Time :  00:00:00.625

C:\> timethis python slott.py urls17000.txt
...
TimeThis :  Elapsed Time :  00:00:00.562

C:\> timethis perl toolkit.pl urls17000.txt
...
TimeThis :  Elapsed Time :  00:00:00.187

結論: すべてのソリューションは 1 秒未満です。パイプは最も遅く、S.Lott のソリューションは上記の python のバージョンよりも高速で、ツールキットの perl ソリューションは最速です。


C:\> timethis perl toolkit.pl urls1778955.txt
...
TimeThis :  Elapsed Time :  00:00:17.656

C:\> timethis "sort urls1778955.txt|uniq -c"
...
TimeThis :  Elapsed Time :  00:01:54.234

$ wc urls1778955.txt
1778955  1778955 81831930 urls1778955.txt

ハッシュは、多数の URL の並べ替えよりも優れています。

于 2008-11-18T00:55:14.360 に答える