Какой самый быстрый способ проверить тип файла большого списка URL-адресов (и как оптимизировать мой код) - PullRequest
0 голосов
/ 09 сентября 2011

У меня есть большой список (расширяющийся с течением времени) URL-адресов, которые мне нужны, чтобы проверить их тип. Вот код, который у меня сейчас есть:

    private string[] MIME = new string[] {
        "audio/ogg - ogg",
        "video/ogg - ogg",
        "application/f4v - mp4",
        "application/octet-stream - mp3",
        "audio/aac - mp3",
        "audio/mp3 - mp3",
        "audio/mp4 - mp4",
        "audio/mp4-latm - m4a",
        "audio/mpeg - mp3",
        "audio/mpeg3 - mp3",
        "audio/x-mpeg - mp3",
        "audio/x-ms-wma - wma",
        "video/f4v - mp4",
        "video/mp4 - mp4",
    };


    private string CheckType(string url) {
        try {
            HttpWebRequest webRequest = (HttpWebRequest) WebRequest.Create(new Uri(url));

            webRequest.UserAgent = "Mozilla/5.0 (Windows NT 6.1; rv:2.0) Gecko/20100101 Firefox/4.0";
            webRequest.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
            webRequest.Timeout = 5000;

            HttpWebResponse webResponse = (HttpWebResponse) webRequest.GetResponse();
            long fileSize = webResponse.ContentLength;

            foreach (string mime_entry in MIME) {
                string sheader = webResponse.Headers.ToString();
                string[] mime = mime_entry.Split(new string[] { " - " }, StringSplitOptions.RemoveEmptyEntries);

                if (sheader.Contains(mime[0])) {
                    return mime[1] + " " + fileSize.ToString();
                }
            }

            return "";
        } catch (Exception ex) {
            return "";
        }
    }
  1. Могу ли я сделать мой запрос быстрее?
  2. Могу ли я как-то использовать многопоточность для более быстрой итерации списка (что если один из потоков останавливается из-за ответа http?)
  3. Есть ли лучший способ сделать это?

1 Ответ

0 голосов
/ 09 сентября 2011
  1. Да, вы можете сделать это быстрее, только отправляя запросы HEAD, поскольку, в конце концов, вы не используете тело ответа ни для чего.

  2. Да, имеет смысл разумно использовать многопоточность - если URL-адреса находятся на разных серверах, то время ожидания сервера будет легко распараллеливаться.Используйте синхронизированную очередь, и некоторые рабочие потоки, обрабатывающие очередь, будут простым способом распараллелить это.Вы можете поэкспериментировать с количеством потоков, я бы попробовал 8 потоков в качестве отправной точки.

  3. См. Выше.Кроме того, ваш MIME-проверочный код является оптимальным.Вы можете использовать Dictionary<string,string> для поиска;и в коллекции Headers вы должны смотреть только на Content-Type, а не на всю коллекцию заголовков.

...