Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Массовый опрос существования файлов 
:(
    Опции темы
Isaev
Дата 30.1.2011, 06:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 8.11.2007
Где: Germany

Репутация: нет
Всего: нет



Дан сервер с парой десятков файлов, имена сформерованы рандомно по маске 'Name_00000000.rar' .. 'Name_FFFFFFFF.rar'. Требуется максимально быстро найти названия файлов!
Делаю так:
Код

Procedure TForm1.Button1Click(Sender:TObject);
Var
  N:Integer;
  G:Cardinal;
  FName,VName:String;
  hSession,hURL:HInternet;
  R:Cardinal;
  Q:Boolean;
  Buf:Byte;
Begin
  N:=0;
  G:=0;
  hSession:=InternetOpen('XXX',PRE_CONFIG_INTERNET_ACCESS,nil,nil,0);
  Repeat
      FName:='Name_'+IntToHex(G,8)+'.rar';
      VName:='http://path/files/'+FName;
      hURL:=InternetOpenURL(hSession,PChar(VName),nil,0,0,0);
      Q:=InternetReadFile(hURL,@Buf,1,R);
      // проверяю 'R' как первый символ Rar-архива 
      If Not(Q) Or (R=0) Or (Buf[1]<>Ord('R')) Then {Memo1.Lines.Append('Err:'+IntToHex(G,8))}
                                                                     Else Memo1.Lines.Append('OK:'+IntToHex(G,8));
      If Assigned(hURL) Then InternetCloseHandle(hURL);
      If N=256 Then
        Begin
          N:=0;
          Edit1.Text:=IntToHex(G,8);
          Application.ProcessMessages;
        End;
    Inc(N);
    Inc(G);
  Until G=High(Cardinal);
  Memo1.Lines.Append('Ende');
  InternetCloseHandle(hSession);
End;

Работает, но по скромным подсчётам 13 лет для полного перебора.
PS: при обращении к несуществующему файлу сервер редиректит на свою страницу с сообщением 404.

PM MAIL ICQ   Вверх
Addmin
Дата 30.1.2011, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 803
Регистрация: 3.2.2006
Где: сослан в Сибирь

Репутация: нет
Всего: 15



Мне кажется, что постановка задачи неверна. Серверу - серверное. Сделайте cgi-программу, которая будет заниматься проверкой файлов на сервере и выдавать список файлов в любом удобном виде, и просто получайте этот список из своей локальной программы.

P.S. И так ли уж нужна проверка архива на первую R? Может просто искать файлы по маске "Name*.rar"?


--------------------
PM MAIL   Вверх
Isaev
Дата 30.1.2011, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 8.11.2007
Где: Germany

Репутация: нет
Всего: нет



Цитата(Addmin @ 30.1.2011,  11:36)

Мне кажется, что постановка задачи неверна. Серверу - серверное. Сделайте cgi-программу, которая будет заниматься проверкой файлов на сервере и выдавать список файлов в любом удобном виде

В чём разница?
Цитата(Addmin @ 30.1.2011,  11:36)

и просто получайте этот список из своей локальной программы

Речь идёт не о своём сервере... Т.е. я cgi туда же всё равно залить не смогу, потому не смогу получить список, как из локальной программы! Или я не совсем понял ход Вашей мысли?
Тогда КАК?
Цитата(Addmin @ 30.1.2011,  11:36)

P.S. И так ли уж нужна проверка архива на первую R? Может просто искать файлы по маске "Name*.rar"?

Вполне, только снова КАК? У меня на считывание 1 байта и на запрос имени разница по времени не получилась.

Это сообщение отредактировал(а) Isaev - 30.1.2011, 16:38
PM MAIL ICQ   Вверх
Addmin
Дата 30.1.2011, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 803
Регистрация: 3.2.2006
Где: сослан в Сибирь

Репутация: нет
Всего: 15



Цитата(Isaev @  30.1.2011,  16:36 Найти цитируемый пост)
В чём разница?

Сервер выполнит операции поиска файлов на себе намного быстрее, чем программа, которая обращается к файлам на сервере с локального компьютера. 

Цитата(Isaev @  30.1.2011,  16:36 Найти цитируемый пост)
Речь идёт не о своём сервере... Т.е. я cgi туда же всё равно залить не смогу, потому не смогу получить список, как из локальной программы! Или я не совсем понял ход Вашей мысли?
Тогда КАК?

Ну, знаете PHP? Хотя бы немного? На любом сервере он должен быть установлен. Если, конечно, это не ftp-хранилище. 

Допустим, скрипт на PHP читает весь список файлов, расположенных на сервере по указанному пути и с нужной маской имени , в массив, а затем выдаёт список файлов в виде текста...

Подождите, вы хотите сказать, что вы вообще не имеете доступа к серверу? То есть, он чужой? Да, тогда дело плохо.





--------------------
PM MAIL   Вверх
Isaev
Дата 30.1.2011, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 8.11.2007
Где: Germany

Репутация: нет
Всего: нет



Цитата(Addmin @  30.1.2011,  16:55 Найти цитируемый пост)
То есть, он чужой?

именно... стал бы я так извращаться на своём  smile 

Это сообщение отредактировал(а) Isaev - 30.1.2011, 16:59
PM MAIL ICQ   Вверх
Isaev
Дата 31.1.2011, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 8.11.2007
Где: Germany

Репутация: нет
Всего: нет



Больше идей ни у кого нету?
PM MAIL ICQ   Вверх
Snowy
Дата 1.2.2011, 01:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



Совет банальный как банан - в 100 тредов задача займет в 100 + (X/K) раз меньше времени
Где X - количество файлов, К - количество вариантов.
Основное время занимает ответ от сервера.
Так что 1 запрос и 100 одновременных запросов  будут выполняться примерно одинаковое время.
Единственная проблема - могут забанить.
Впрочем, в случае одного треда это не менее реально.
Также не обязательно тянуть сразу файл.
Можно сначала запросить Head. И, если информация о файле устраивает, то тянуть уже файл, а не тягать 404-ю страницу каждый раз целиком.
Ну какой смысл тянуть всю страницу? 404? Всё, брось каку. Не нужно читать файл (InternetReadFile). Он не вкусный.
PM MAIL   Вверх
Isaev
Дата 1.2.2011, 03:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 8.11.2007
Где: Germany

Репутация: нет
Всего: нет



Цитата(Snowy @  1.2.2011,  01:54 Найти цитируемый пост)
Совет банальный как банан - в 100 тредов задача займет в 100 + (X/K) раз меньше времени

Ну это ясно, остаётся только потестить какую нагрузку выдержит сервер...

Цитата(Snowy @  1.2.2011,  01:54 Найти цитируемый пост)
Можно сначала запросить Head

Вот про HEAD не знал, спасибо... Буду на досуге мучить дальше smile
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0824 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.