2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2
 
 Re: Вопрос по оптимазации скрипта
Сообщение05.08.2013, 10:03 
Заслуженный участник


06/07/11
5627
кран.набрать.грамота
Alibek24 в сообщении #751389 писал(а):
Все работает но очень долго. Если кто сможет помочь улучшить алгоритм буду очень признателен.
Сколько времени работал ваш алгоритм сначала и сколько работает сейчас? Я вечером дома попробую, потом скажу, что у меня получилось.

Еще могу предложить сделать один раз расчет расстояний между каждой парой точек (я так понимаю, это расстояния рассчитываются?) и хранить их отдельно готовые. Данных, конечно, будет целый гигабайт, но зато прочитать гигабайт будет быстрее (особенно если хранить в СУБД), чем каждый раз перерасчитывать.

P. S. У меня на работе 30000 точек за 10 минут рассчитались, но там сервер мощный. Вечером дома на домашнем ноуте проверю.

 Профиль  
                  
 
 Re: Вопрос по оптимазации скрипта
Сообщение05.08.2013, 19:27 


28/03/10
68
rockclimber в сообщении #752061 писал(а):
Alibek24 в сообщении #751389 писал(а):
Все работает но очень долго. Если кто сможет помочь улучшить алгоритм буду очень признателен.
Сколько времени работал ваш алгоритм сначала и сколько работает сейчас? Я вечером дома попробую, потом скажу, что у меня получилось.

Еще могу предложить сделать один раз расчет расстояний между каждой парой точек (я так понимаю, это расстояния рассчитываются?) и хранить их отдельно готовые. Данных, конечно, будет целый гигабайт, но зато прочитать гигабайт будет быстрее (особенно если хранить в СУБД), чем каждый раз перерасчитывать.

P. S. У меня на работе 30000 точек за 10 минут рассчитались, но там сервер мощный. Вечером дома на домашнем ноуте проверю.

В общем я сделал ресамплинг (раньше было каждые десять сантиметров, теперь по метру) моих данных по z, и теперь общее количество точек 1800. Считает вроде теперь минут 5 на питоне, и очень долго (где то полчаса) на R. Но все равно надо будет все таки посчитать по 10 см. думаю сохранить расстояния будет самым оптимальным выбором.

А есть здесь люди занимающиеся статистическим анализом данных. Какие методы анализа можно сделать. Слышал про ANOVA можно ли такое в пространственной статистике использовать?

 Профиль  
                  
 
 Re: Вопрос по оптимазации скрипта
Сообщение06.08.2013, 07:32 
Заслуженный участник


06/07/11
5627
кран.набрать.грамота
Alibek24 в сообщении #752290 писал(а):
rockclimber в сообщении #752061 писал(а):
Alibek24 в сообщении #751389 писал(а):
Все работает но очень долго. Если кто сможет помочь улучшить алгоритм буду очень признателен.
Сколько времени работал ваш алгоритм сначала и сколько работает сейчас? Я вечером дома попробую, потом скажу, что у меня получилось.

Еще могу предложить сделать один раз расчет расстояний между каждой парой точек (я так понимаю, это расстояния рассчитываются?) и хранить их отдельно готовые. Данных, конечно, будет целый гигабайт, но зато прочитать гигабайт будет быстрее (особенно если хранить в СУБД), чем каждый раз перерасчитывать.

P. S. У меня на работе 30000 точек за 10 минут рассчитались, но там сервер мощный. Вечером дома на домашнем ноуте проверю.

В общем я сделал ресамплинг (раньше было каждые десять сантиметров, теперь по метру) моих данных по z, и теперь общее количество точек 1800. Считает вроде теперь минут 5 на питоне, и очень долго (где то полчаса) на R. Но все равно надо будет все таки посчитать по 10 см. думаю сохранить расстояния будет самым оптимальным выбором.
Видимо, все дело в том, что R - это интерпретируемый язык (глянул сейчас в Википедию одним глазом). Интерпретируемые языки принципиально медленные, тут уж ничего не поделаешь. Если он проигрывает питону в 6 раз, то это еще неплохой результат. Питон тоже вроде как интерпретируемый, но он компилируется в байт-код и, видимо, за счет этого выигрывает (байт-код еще немного оптимизируется, и на рассчетных задачах он может вплотную приблизиться к С/С++). Если перенесете на компилируемый язык (си или паскаль), можете получить еще немного прироста скорости относительно питона, но на прорыв уже не рассчитывайте.
Вот результат теста на моем ноутбуке (процессор core i5).
ОС - вин7, на ней стоит виртуалка с Oracle Linux, в линуксе стоит СУБД Oracle. В БД создал 1 таблицу:
Код:
create table data_test(p_name varchar2(10), x number, y number, z number, val number, n number);
Заполнил ее случайными данными (30 000 точек):
Код:
begin
    insert into data_test
    select dbms_random.string('X', 10), dbms_random.value, dbms_random.value, dbms_random.value, dbms_random.value, rownum
      from dual
      connect by level <=30000;
      commit;
end;
Дальше - не уверен, что правильно понял вашу формулу, но я понял так, что надо для каждой пары точек рассчитать расстояние между ними (или квадраты расстояний? - у меня квадраты суммируются), сложить их, умножить на число пар и поделить на два. Соответствующий SQL-запрос:
Код:
select sum((x1.x - x2.x) * (x1.x - x2.x) + (x1.y - x2.y) * (x1.y - x2.y) + (x1.z - x2.z) * (x1.z - x2.z)) * count(*) / 2
  from data_test x1,
       data_test x2
where x1.p_name <> x2.p_name
  and x1.n > x2.n;
Отработало (учтите при этом, что это на виртуалке) за 40 минут. Так что переходите на компилируемые языки. Ну и еще могу посоветовать для больших объемов данных (если у вас тысячи точек) использовать реляционные базы данных. Потратите неделю на изучение SQL и какой-нибудь СУБД (берите PostgreSQL, не прогадаете), зато сэкономите на хранении данных (запись, чтение, фильтрация), обработке и времени написания кода.

 Профиль  
                  
 
 Re: Вопрос по оптимазации скрипта
Сообщение06.08.2013, 13:24 


28/03/10
68
Сколько времени работал ваш алгоритм сначала и сколько работает сейчас? Я вечером дома попробую, потом скажу, что у меня получилось.

Еще могу предложить сделать один раз расчет расстояний между каждой парой точек (я так понимаю, это расстояния рассчитываются?) и хранить их отдельно готовые. Данных, конечно, будет целый гигабайт, но зато прочитать гигабайт будет быстрее (особенно если хранить в СУБД), чем каждый раз перерасчитывать.

P. S. У меня на работе 30000 точек за 10 минут рассчитались, но там сервер мощный. Вечером дома на домашнем ноуте проверю.Видимо, все дело в том, что R - это интерпретируемый язык (глянул сейчас в Википедию одним глазом). Интерпретируемые языки принципиально медленные, тут уж ничего не поделаешь. Если он проигрывает питону в 6 раз, то это еще неплохой результат. Питон тоже вроде как интерпретируемый, но он компилируется в байт-код и, видимо, за счет этого выигрывает (байт-код еще немного оптимизируется, и на рассчетных задачах он может вплотную приблизиться к С/С++). Если перенесете на компилируемый язык (си или паскаль), можете получить еще немного прироста скорости относительно питона, но на прорыв уже не рассчитывайте.
Вот результат теста на моем ноутбуке (процессор core i5).
ОС - вин7, на ней стоит виртуалка с Oracle Linux, в линуксе стоит СУБД Oracle. В БД создал 1 таблицу:
Код:
create table data_test(p_name varchar2(10), x number, y number, z number, val number, n number);
Заполнил ее случайными данными (30 000 точек):
Код:
begin
    insert into data_test
    select dbms_random.string('X', 10), dbms_random.value, dbms_random.value, dbms_random.value, dbms_random.value, rownum
      from dual
      connect by level <=30000;
      commit;
end;
Дальше - не уверен, что правильно понял вашу формулу, но я понял так, что надо для каждой пары точек рассчитать расстояние между ними (или квадраты расстояний? - у меня квадраты суммируются), сложить их, умножить на число пар и поделить на два. Соответствующий SQL-запрос:
Код:
select sum((x1.x - x2.x) * (x1.x - x2.x) + (x1.y - x2.y) * (x1.y - x2.y) + (x1.z - x2.z) * (x1.z - x2.z)) * count(*) / 2
  from data_test x1,
       data_test x2
where x1.p_name <> x2.p_name
  and x1.n > x2.n;
Отработало (учтите при этом, что это на виртуалке) за 40 минут. Так что переходите на компилируемые языки. Ну и еще могу посоветовать для больших объемов данных (если у вас тысячи точек) использовать реляционные базы данных. Потратите неделю на изучение SQL и какой-нибудь СУБД (берите PostgreSQL, не прогадаете), зато сэкономите на хранении данных (запись, чтение, фильтрация), обработке и времени написания кода.[/quote]

Думаю тут неважно какие алгебраические формулы используются, а более важны условия на 30к строк. Время их обработки.

Наверно так и сделаю, и создам базу данных. Язык R конечно очень хорош своими дополнениями, но все таки легче все самому написать на питоне думаю. Или использовать их в связке, потому что возможности в изображении графиков у R больше чем у matplotlib.

Мне интересно как связать питон и базу данных, ту же PostgreSQL. Idle использую Eclipse.

Кстати на R есть пакет geoR, который очень быстро все это считает. Но я не уверен считает ли он то что мне нужно. Если кто знает как можно посмотреть код который прописан для определенной функции в пакете, буду признателен помощи. Эти пакеты устанавливаются непосредственно в RStudio, а так файлы зипованные которые она загружает.

 Профиль  
                  
 
 Re: Вопрос по оптимазации скрипта
Сообщение06.08.2013, 13:31 
Заслуженный участник


06/07/11
5627
кран.набрать.грамота
Alibek24 в сообщении #752478 писал(а):
Мне интересно как связать питон и базу данных, ту же PostgreSQL. Idle использую Eclipse.

Кстати на R есть пакет geoR, который очень быстро все это считает. Но я не уверен считает ли он то что мне нужно. Если кто знает как можно посмотреть код который прописан для определенной функции в пакете, буду признателен помощи. Эти пакеты устанавливаются непосредственно в RStudio, а так файлы зипованные которые она загружает.
Это вам лучше искать форумы и сайты, посвященные соответствующим языкам. По питону и постгресу на русском много информации, найдете без проблем, а вот про R ничего не скажу.

 Профиль  
                  
 
 Re: Вопрос по оптимазации скрипта
Сообщение06.08.2013, 22:39 
Заслуженный участник


15/05/05
3445
USA
Alibek24 в сообщении #752478 писал(а):
Кстати на R есть пакет geoR, который очень быстро все это считает. Но я не уверен считает ли он то что мне нужно. Если кто знает как можно посмотреть код который прописан для определенной функции в пакете, буду признателен помощи.
CRAN: Информация о пакете geoR
- с этой страницы можно скачать тарболл с исходниками.

(Так можно найти исходники к любому пакету, храняшемуся на сайте проекта R.)

 Профиль  
                  
 
 Re: Вопрос по оптимазации скрипта
Сообщение07.08.2013, 10:39 


28/03/10
68
Yuri Gendelman в сообщении #752697 писал(а):
Alibek24 в сообщении #752478 писал(а):
Кстати на R есть пакет geoR, который очень быстро все это считает. Но я не уверен считает ли он то что мне нужно. Если кто знает как можно посмотреть код который прописан для определенной функции в пакете, буду признателен помощи.
CRAN: Информация о пакете geoR
- с этой страницы можно скачать тарболл с исходниками.

(Так можно найти исходники к любому пакету, храняшемуся на сайте проекта R.)

И как смотреть именно коды?

 Профиль  
                  
 
 Re: Вопрос по оптимазации скрипта
Сообщение07.08.2013, 14:08 
Аватара пользователя


11/06/12
10390
стихия.вздох.мюсли
Цитата:
Package source: geoR_1.7-4.tar.gz

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 23 ]  На страницу Пред.  1, 2

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group