0

離れた場所に約300kの画像ファイルがあります。私はこれらのファイルの詳細をダウンロードして(しなければなりません)、テキストファイルに書き込みます(いくつかの追加情報を含む)。取得する情報の性質上、到着時に各ファイルを処理する必要があります(また、各ファイル情報をファイル行に書き込みます)。たとえば、属性を持つオブジェクトのリストがあります。サイズとカウントを使用して、特定のサイズの画像がいくつあるかを確認します。

また、統計情報を保持せずにすべてをファイルに読み書きして、ファイルをもう一度開いて統計を追加できるようにすることも考えました。しかし、統計情報のために250k行のマルチ属性ファイルを処理する方法を考えることはできません。

私はリストを知っています(ええ、私はそれらを2つ持っています)、そして各アイテムの一定のループがアプリケーションを悩ませていますが、別の方法はありますか?現在、2時間経過していますが、アプリケーションはまだ26kです。画像アイテムごとに、このようなことを行って、画像が以前の特定のサイズであるかどうかを確認し、そのリストアイテムに追加します。

public void AddSizeTokens(Token token)
{
  int index = tokenList.FindIndex(item => item.size== token.size);
  if (index >= 0)
    tokenList[index].count+=1;
  else
    tokenList.Add(token);
}

私が書いたファイルからの1行はどのように見えるか

Hits    Size     Downloads     Local Loc                   Virtual ID
204     88.3        4212        .../someImage.jpg       f-dd-edb2-4a64-b42

以下のようなファイルをダウンロードしています。

try
{
   using (WebClient client = new WebClient())
   {
     if (File.Exists(filePath + "/" + fileName + "." + ext))
     {
        return "File Exists: " + filePath + "/" + fileName + "." + ext;
     }
     client.DownloadFile(virtualPath, filePath + "/" + fileName + "." + ext);
     return "Downloaded: " + filePath + "/" + fileName + "." + ext;
   }
 }
 catch (Exception e)  {
      return"Problem Downloading " + fileName + ": " + e.Message;
 }
4

2 に答える 2

0

tokenListからList<Token>に変更する必要がありますDictionary<long, Token>
重要なのはサイズです。

コードは次のようになります。

Dictionary<long, Token> tokens = new Dictionary<long, Token>();

public void AddSizeTokens(Token token)
{
    Token existingToken;
    if(!tokens.TryGetValue(token.size, out existingToken))
        tokens.Add(token.size, token);
    else
        existingToken.count += 1;
}

これにより、O(n)操作からO(1)操作に変更されます。

考慮すべきもう1つのポイントは、Destrictorのコメントです。あなたのインターネット接続速度はおそらくここのボトルネックです。

于 2013-02-08T11:00:54.653 に答える
0

まあ、おそらくコーディングが問題だと思いました。問題のいくつかは確かにそうだった。Daniel Hilgarthの指示によると、辞書に変更することは大いに役立ちましたが、最初の30分だけでした。それからそれは毎分悪化していました。

問題は明らかに、私が情報を提供した無邪気なUI要素でした。彼らは非常に多くのCPUを食べ尽くしたため、最終的にアプリケーションを強制終了しました。UI情報フィードを最小化することが役立ちました(1分あたり1.5kから最も遅い1.3kまで)。信じられない!同様の問題を抱えている他の人に役立つことを願っています。

于 2013-02-11T13:58:56.050 に答える