Сколько времени работал ваш алгоритм сначала и сколько работает сейчас? Я вечером дома попробую, потом скажу, что у меня получилось.
Еще могу предложить сделать один раз расчет расстояний между каждой парой точек (я так понимаю, это расстояния рассчитываются?) и хранить их отдельно готовые. Данных, конечно, будет целый гигабайт, но зато прочитать гигабайт будет быстрее (особенно если хранить в СУБД), чем каждый раз перерасчитывать.
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, а так файлы зипованные которые она загружает.