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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Радужная таблица 
:(
    Опции темы
кмс
Дата 13.1.2014, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 12.2.2009
Где: Казахстан

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



Здравствуйте.
Нужно создать базу, в который записывается результат пересчета 5 байт, или проще нужно пересчитать 1099511627775 вариантов и результат каждого варианта записать в базу(обычный бинарный файл). Каждый вариант занимает 11 байт. База получается огромная.
Мне посоветовали посмотреть в сторону радужных таблиц. Прежде чем начать изучать тему может кто нибудь посоветует.
Подойдут ли эти таблицы для моего случая.
Вот примерный вариант базы http://s019.radikal.ru/i640/1401/03/2f215236cac5.png 
1 и 2 это данные по которым будет искаться то что отмечено под 3.
Вернее будет искаться только то что под 1, если находится то с данными под 2 будет производиться некая операция и если все сходится то поиск окончен.
Вообщем нужен совет, можно ли в данном случае применить радужную таблицу?


Это сообщение отредактировал(а) кмс - 13.1.2014, 17:40
PM MAIL   Вверх
кмс
Дата 13.1.2014, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 12.2.2009
Где: Казахстан

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



Если есть специалисты по этой теме, готов оплатить потраченное время на создание такой таблицы.
Вернее не на создание, там уйму времени уйдет, а на написание проги для ее создания.
PM MAIL   Вверх
Illusion Dolphin
Дата 13.1.2014, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1198
Регистрация: 3.5.2003

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



1099511627775  * 11 = 11 терабайт данных. Зачем вам записывать куда-то столько данных, если их можно рассчитать? Что вообще надо делать? Ну создали вы базу, а затем какие операции надо? Для чего это вообще делается?


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
кмс
Дата 13.1.2014, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 12.2.2009
Где: Казахстан

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



Цитата(Illusion Dolphin @  13.1.2014,  22:50 Найти цитируемый пост)
1099511627775  * 11 = 11 терабайт данных. Зачем вам записывать куда-то столько данных, если их можно рассчитать?

Потому что рассчитать намного дольше чем потом в базе искать, на порядок дольше.
Создавать базу придется, по предварительным расчетам около месяца и то если будет достаточно компов.
Цитата(Illusion Dolphin @  13.1.2014,  22:50 Найти цитируемый пост)
 Что вообще надо делать? Ну создали вы базу, а затем какие операции надо? Для чего это вообще делается?

База нужна для хранения готовых расчетов. Я уже объяснил выше немного принцип.
База состоит из трех значений, два по три байта и одному по 5 байт, по одному из трех байт будет поиск, если они находятся, со вторыми тремя байтами будет производится математический расчет и если расчет совпадает то будет считывать последние 5 байт.
Более подробнее про базу сказать не могу smile
Ничего криминального, но распространяться не хочу.
Другие подобные базы имеют размер около 10-15гб, и поиск происходит ну 15-20 минут.
мне намекнули что там тоже эти самые таблицы, правда или нет не знаю.




Это сообщение отредактировал(а) кмс - 13.1.2014, 23:44
PM MAIL   Вверх
kami
Дата 14.1.2014, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

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



Цитата(Illusion Dolphin @  13.1.2014,  22:50 Найти цитируемый пост)
11 терабайт данных. 

+ служебная информация, индексы...

Цитата(кмс @  13.1.2014,  23:43 Найти цитируемый пост)
Потому что рассчитать намного дольше чем потом в базе искать, на порядок дольше.

Даже если принять, что создание 1 записи займет 1 миллисекунду, один компьютер будет писать данные 34 года. Если предположить, что увеличение числа компьютеров даст линейный прирост скорости (на самом деле - несколько меньше), то чтобы получить 1 месяц нужно 408 компов (ну, ладно - все они четырехядерные, тогда -  102) smile   
А теперь, внимание - исходя из Вашего "на порядок дольше" и моего предположения в "1 мс" получается, что поиск значения должен вестись максимум за 0,1 мс??? Имхо, тут никакие индексы, партицирование и т.п. не помогут... хотя партиции - это вариант, но отца русской демократии они не спасут. 

Где у меня ошибка в расчетах?

Ну и плюс ко всему - минимум 11 терабайт... многовато будет.
Цитата(кмс @  13.1.2014,  23:43 Найти цитируемый пост)
Другие подобные базы имеют размер около 10-15гб, и поиск происходит ну 15-20 минут.

А не может такого быть, что эти базы содержат (дальше - полет фантазии) к примеру - промежуточные значения вычислений? или конечные, но с каким-нибудь шагом? Программа выбирает нужное ей и производит до-обработку или "интерполяцию значений, максимально близких к требуемому" (которая как раз и занимает основное время из 10-15 минут)
?

Добавлено @ 22:44
Цитата(кмс @  13.1.2014,  23:43 Найти цитируемый пост)
поиск происходит ну 15-20 минут.

Если использовать при расчетах не 1 миллисекунду, а (15-20 минут)*10, то итоговые значения получаются вообще неадекватными. Посему - не думаю, что в аналогах эта задача решалась "в лоб".

Это сообщение отредактировал(а) kami - 14.1.2014, 22:45
PM MAIL WWW   Вверх
boobie
Дата 15.1.2014, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



kami, 
ошибся в расчетах  smile 

Запилил программку с тремя потоками, каждый поток генерирует одиннадцатибайтовые числа от 10000000000 до 10001000000 в простом цикле. Все, что сгенерировал - кидает в массив. Цикл проходит за доли секунды, даже не могу отловить этот момент.
Затем каждый поток записывает свой массив в файл.
На запись 3-х файлов по 1 млн. одиннадцатибайтовых чисел (в каждый) ушла минута. Сама запись идет долго, но я думаю, что тут можно как-нибудь оптимизировать процесс. Сделать ассемблерные вставки, использовать нестандартные функции или еще что-нибудь.
И да, процессор 6-летней давности не был загружен на всю катушку. И это все на гражданских Дельфях, в простых потоках с "синхронайзом" и записью с помощью writeln  smile .
Код

unit Unit2;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  mypot = class(TThread)
  private
    { Private declarations }
  protected
    schet:integer;
    massiv1:array[1..1010000]of integer;
    massiv2:array[1..1010000]of integer;
    massiv3:array[1..1010000]of integer;
    procedure Execute; override;
  public
    flag:integer;

  end;

implementation

{ 
  Important: Methods and properties of objects in visual components can only be
  used in a method called using Synchronize, for example,

      Synchronize(UpdateCaption);  

  and UpdateCaption could look like,

    procedure mypot.UpdateCaption;
    begin
      Form1.Caption := 'Updated in a thread';
    end; 
    
    or 
    
    Synchronize( 
      procedure 
      begin
        Form1.Caption := 'Updated in thread via an anonymous method' 
      end
      )
    );
    
  where an anonymous method is passed.
  
  Similarly, the developer can call the Queue method with similar parameters as 
  above, instead passing another TThread class as the first parameter, putting
  the calling thread in a queue with the other thread.
    
}

uses Unit1;

{ mypot }

procedure mypot.Execute;
var f1,f2,f3:textfile;

begin
schet:=1;
//while terminated=false do
begin
  Synchronize(
      procedure
      var i:integer;
      begin
        if flag=1 then
        begin
          for i:=10000000000 to 10001000000 do
          begin
            massiv1[schet]:=i;
            inc(schet);
            form1.Label8.caption:=inttostr(schet);
          end;
          form1.label1.Caption:=form1.label7.caption;
          assignfile(f1,'t1.txt');
          rewrite(f1);
          for I := 1 to 1000000 do
          writeln(f1,massiv1[i]);
          closefile(f1);
          form1.label4.Caption:=form1.label7.caption;
        end;

        if flag=2 then
        begin
          for i:=20000000000 to 20001000000 do
          begin
            massiv2[schet]:=i;
            inc(schet);
          end;
          form1.label2.Caption:=form1.label7.caption;
          assignfile(f2,'t2.txt');
          rewrite(f2);
          for I := 1 to 1000000 do
          writeln(f2,massiv2[i]);
          closefile(f2);
          form1.label5.Caption:=form1.label7.caption;
        end;


        if flag=3 then
        begin
          for i:=30000000000 to 30001000000 do
          begin
            massiv3[schet]:=i;
            inc(schet);
          end;
          form1.label3.Caption:=form1.label7.caption;
          assignfile(f3,'t3.txt');
          rewrite(f3);
          for I := 1 to 1000000 do
          writeln(f3,massiv3[i]);
          closefile(f3);
          form1.label6.Caption:=form1.label7.caption;
        end;
      end
      );
end;
end;

end.

PM   Вверх
kami
Дата 15.1.2014, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

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



Цитата(boobie @  15.1.2014,  09:37 Найти цитируемый пост)
ошибся в расчетах 

Где? Этот пример - не показатель (несмотря на то, что в нем де-факто не используются потоки) , я отталкивался от утверждений
Цитата(кмс @  13.1.2014,  23:43 Найти цитируемый пост)
рассчитать намного дольше чем потом в базе искать

и
Цитата(кмс @  13.1.2014,  23:43 Найти цитируемый пост)
Другие подобные базы имеют размер около 10-15гб, и поиск происходит ну 15-20 минут.

В примере же сами вычисления, с учетом всяческих ухищрений в современных процессорах (за исключением строки 
Код

form1.Label8.caption:=inttostr(schet);
) не занимают вообще ничего.

Это сообщение отредактировал(а) kami - 15.1.2014, 10:55
PM MAIL WWW   Вверх
boobie
Дата 15.1.2014, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Потоки позволяют использовать все возможности многоядерных процессоров. Я создал 3 экземпляра данного класса, установив им разные флажки.
Я о том, что ни о каких 34 годах речь не идет) Максимум - полгода)
А вот поиск по 10Тб базе - это да, это вопрос.

Наверно для майнинга такие штуки нужны... Или аккаунты ВК ломать  smile 

PM   Вверх
kami
Дата 15.1.2014, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

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



Цитата(boobie @  15.1.2014,  11:14 Найти цитируемый пост)
Потоки позволяют использовать все возможности многоядерных процессоров. 

Это не относится к делу, но в Вашем коде не используюется многопоточность. Весь код выполняется в основном потоке. Если желаете продолжить дискуссию на эту тему - давайте вернемся в Ваш топик.

А по теме - ТС утверждает, что создание каждой 11-байтной записи очень ресурсоемкая операция. Я привел расчеты. Единственным "узким" местом в моем сообщении было получение 34 лет. Расшифрую:
1099511627775 / 1000(мс) /60(сек)/60(мин)/24(час)/365(дней) = 34,8 лет.

Вы утверждаете, что они не верны. Приведите доказательства.

Это сообщение отредактировал(а) kami - 15.1.2014, 11:29
PM MAIL WWW   Вверх
кмс
Дата 15.1.2014, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 12.2.2009
Где: Казахстан

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



Вот делал специально программку что бы сравнивать разницу между поиском и перебором.
Может быть там и не совсем точно, так как при поиске не учитываются некоторые нюансы, но и отклонения не столь существенные.
http://www.sendspace.com/file/cny0tv
PS: конечное значение это сколько вариантов перебирать.
Это число делиться на количество потоков и каждый поток работает со своим отрезком.
А так пробовал создавать базу, у меня 300мб (три потока каждый по 100мб) создавались примерно 30-40 минут, точнее не скажу, врубил и пошел телек смотреть, так заглядывал нет нет.
Но и поиск будет не по всей базе. Например можно рассортировать по первому байту искомого, и того получается 255 баз, прога сразу будет искать в нужной базе.


Это сообщение отредактировал(а) кмс - 15.1.2014, 11:53
PM MAIL   Вверх
kami
Дата 15.1.2014, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

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



Цитата(кмс @  15.1.2014,  11:38 Найти цитируемый пост)
при поиске не учитываются некоторые нюансы,

А где оно ищет, если не секрет? Что-то слишком быстро проходит поиск, без разницы что я задам в поле "конечное значение" smile
PM MAIL WWW   Вверх
кмс
Дата 15.1.2014, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 12.2.2009
Где: Казахстан

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



Ну там в поиске просто сравнение
Код

  while ks < ke do
  begin
    if (b = 22) and (b1 = 23) then
      krr := 0;
    inc(ks);
  end;

не учитывается загрузка базы и лазанье по ней, но и при переборе тоже это все не учитывается, прогу делал просто сравнить примерно разницу между поиском и перебором.

Добавлено через 2 минуты и 11 секунд
Ты введи все 5 байт - 1099511627775 smile и тогда придется подождать smile

Добавлено через 11 минут и 51 секунду
Вот скрин, это поиск по всем вариантам.
http://s005.radikal.ru/i210/1401/65/5093ca998501.png 
Но как говорил выше реальный поиск по все базе конечно будет дольше, но и если учитывать что искать во первых будет не по все базе, во вторых все таки не обязательно что придется искать до конца, наткнутся на искомое может в любое время smile


Это сообщение отредактировал(а) кмс - 15.1.2014, 11:56
PM MAIL   Вверх
boobie
Дата 15.1.2014, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



kami, да ну! В одном потоке? Я привел класс потока:
Код

mypot = class(TThread)

Код с формой и запуском потоков такой (если интересно):
Код

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, unit2;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Timer1: TTimer;
    Button2: TButton;
    Label8: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    pot: array[1..3] of mypot;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin

timer1.Enabled:=true;
pot[1].start;
pot[2].start;
pot[3].start;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
pot[1].Terminate;
pot[2].Terminate;
pot[3].Terminate;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
pot[1]:=mypot.Create(true);
pot[2]:=mypot.Create(true);
pot[3]:=mypot.Create(true);

pot[1].Priority:=tpnormal;
pot[2].Priority:=tpnormal;
pot[3].Priority:=tpnormal;

pot[1].flag:=1;
pot[2].flag:=2;
pot[3].flag:=3;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
label7.Caption:=floattostr(strtofloat(label7.Caption)+0.1);
end;

end.

И он немного долбанутый, особенно таймер не к месту... Ну да пофиг, сделал его за 2 минуты...
Создается 3 объекта того класса.

А по поводу времени
Цитата

Даже если принять, что создание 1 записи займет 1 миллисекунду

За 1 мс моя прога делает 50 записей. И, я повторюсь, этот процесс можно ускорить,
поэтому
Цитата

1099511627775 / 1000(мс) /60(сек)/60(мин)/24(час)/365(дней) = 34,8 лет.

это можно смело делить на 50.
Вся проблема будет только в организации работы всей базы и поиском.


Это сообщение отредактировал(а) boobie - 15.1.2014, 12:11
PM   Вверх
kami
Дата 15.1.2014, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

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



Цитата(boobie @  15.1.2014,  12:10 Найти цитируемый пост)
Я привел класс потока:

Весь код Вашего потока заключен в выполнении Synchronize. Если нажать F1, то выяснится, что Synchronize выполняет код в контексте основного потока (или потока-родителя, в зависимости от версии Delphi). Методы переключения контекста (емнип) разнятся так же в зависимости от версии Delphi.
Все три потока при создании выполняют одно действие - пытаются переключиться в контекст основного потока приложения. И уже после переключения выполняется анонимный метод.
Вывод: сколько бы таких потоков ни было создано, выполнение будет идти в контексте одного, что сразу сводит на нет необходимость их создания.
Емнип, такой подход встречался в книгах Фленова (не к ночи будет помянут) и основанных на его книгах примерах.
Совет: выкиньте эти книги и почитайте для начала хотя бы статью на Винграде.
PM MAIL WWW   Вверх
кмс
Дата 15.1.2014, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 12.2.2009
Где: Казахстан

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



Можно конечно уменьшить базу и без всяких таблиц. Например писать в нее только первые 6 байт, а искомые 5 байт будут адрес / 6
Но все равно база большая получается и не получится ее отсортировать, хотя и над сортировкой тоже в принципе можно подумать.

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

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

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

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


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

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


 




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


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

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