2

PowerShell でスクリーン スクレイピング コードをいくつか書きましたが、いくつかの HTML テーブルを解析するのに約 30 秒かかったことに驚きました。私はそれを取り除いて、すべての時間が費やされている場所を見つけようとしましたが、それはgetElementsByTagName通話にあるようです.

以下に、自宅のデスクトップ、職場のデスクトップ、自宅のスレートの両方で、反復ごとに約 1 ~ 2 秒かかるスクリプトを含めました (完全な結果を以下に貼り付けます)。ただし、PowerShell コミュニティの他の人々は、はるかに短い時間 (反復ごとにわずか数ミリ秒) を報告しています。

問題を絞り込む方法を見つけるのに苦労していますが、OS/PS/.NET/IE のバージョンにはパターンがないようです。

私が現在実行しているデスクトップは、PS3 と .NET 4.5 (およびすべての Windows Update パッチ) のみがインストールされた、まったく新しい Windows 8 インストールです。ビジュアル スタジオはありません。PowerShell プロファイルがありません。

$url = "http://www.icy-veins.com/restoration-shaman-wow-pve-healing-gear-loot-best-in-slot"
$response = (iwr $url).ParsedHtml

# Loop through the h2 tags
$response.body.getElementsByTagName("h2") | foreach {

    # Get the table that comes after the heading
    $slotTable = $_.nextSibling

    # Grab the rows from the table, skipping the first row (column headers)
    measure-command { $rows = $slotTable.getElementsByTagName("tr") | select -Skip 1 } | select TotalMilliseconds
}

私のデスクトップからの結果 (仕事用 PC とスレートではほぼ同じ結果が得られます):

TotalMilliseconds
-----------------
        1575.7633
        2371.5566
        1073.7552
        2307.8844
        1779.5518
        1063.9977
        1588.5112
        1372.4927
        1248.7245
        1718.3555
         3283.843
        2931.1616
        2557.8595
        1230.5093
         995.2934

ただし、Google+ PowerShell コミュニティの一部の人々は、次のような結果を報告しています。

 TotalMilliseconds
 -----------------
           76.9098
          112.6745
           56.6522
          140.5845
           84.9599
           48.6669
           79.9283
           73.4511
           94.0683
           81.4443
           147.809
          139.2805
          111.4078
           56.3881
           41.3386

PowerShell ISE と標準コンソールの両方を試しましたが、違いはありません。行われている作業については、これらの時間はやや過剰に思えます。Google + コミュニティの投稿から判断すると、作業はより速く進む可能性があります。

4

3 に答える 3

5

進捗を無効にしてみましたか?

$ProgressPreference = "SilentlyContinue"

私の場合、これにより .NET の重大なパフォーマンスの問題が解決されましたInvoke-WebRequest

于 2013-12-20T10:29:30.940 に答える
0

新しい Windows 8 システムでも同じ現象に気付きました。サーバーの負荷、帯域幅などに応じてダウンロードに2〜5分かかる104MBのファイルをリモートWebサーバーに保存しています.FF、IE10、Chrome、cURLを試し、さらにテストFTPサーバーをセットアップして試しましたWindows FTP コマンド。一貫して同じ結果が得られます。

ただし、同じファイル (これは誇張ではありません) の転送には 3 時間近くかかります。

$file = 'C:\User\me\Desktop\file.mp4'
$site = 'http://my.site/file.mp4'
Invoke-WebRequest $site -Method Get -OutFile $file

サイトはhttpsではなく、ファイルは実行可能ファイルでも、Windowsが「安全ではない」と見なす可能性のあるものでもなく、認証は必要ありません。完了するまでに永遠に時間がかかります。

私の AV のリアルタイム スキャンが原因かもしれないと思ったのですが、それを無効にしても目に見える違いはありませんでした。ここで作業中のメモリ割り当てがあったのでしょうか?-ReadCount オプションを Get-Content に追加すると、大きなファイルのコンテンツの取得が大幅に高速化されるのと同じように? Invoke-WebRequest にそのようなオプションが見つかりません。

于 2013-02-02T01:01:02.667 に答える