Need help! Не решается задача, упираюсь в ограничения железа - страница 12

 
komposter:


Вся база вписуется в 10 лям строк или нет? все файлы совокупно
 
Candid:

Но последовательности же независимы друг от друга? Тогда почему нельзя сделать сразу цикл по датам на один раз загруженной последовательности? Здесь, кстати, как раз может появиться возможность перейти к какому-нибудь эффективному рекуррентному алгоритму, но это как повезёт. Размерность миллион на миллион останется, а файл один раз будет читаться.

Вообще конечно задача, в которой на следующей итерации число шагов остаётся прежним (то есть зона поиска по мере расчётов не сужается), не выглядит особо робастной. Но это субъективно конечно.

Рекурсия на таких размерностях упадёт по превышению лимита кеша.
 
 Есть много однотипных последовательностей сделок, каждая последовательность отсортирована по времени.

Сделки в разных последовательностях разные, по времени распределены неравномерно (и в каждой последовательности по своему). Сделок разное количество. Но все - в интервале от Даты1 до Даты2.

Задача - двигаясь от Д1 до Д2 с шагом М минут (а лучше - конкретно по точкам совершения сделок всех последовательностей), находить последовательность, которая лучше остальных по критерию К (отдельная задача - не просто находить лучшую последовательность, а сортировать все множество по критерию и выводить 10 лучших - но это факультатив, пока не обязательно).

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

С этого и надо было начинать.

Правильно ли мной было понято следующее:

1) Файл размером 20 гб состоит из около миллиона отсортированных по времени последовательностей 

2) Размер каждой последовательности может отличаться и зависит от количества сделок, которые содержит в себе последовательность 

3) В среднем размер последовательности 20/10^6 = 20 Мб, то что загрузим полностью одну последовательность мы можем гарантировать?

4) Коэффициент К зависит только от сделок внутри данной последовательности

5) Для каждой последовательности мы должны найти К (в общем счете 10^6 штук) и выбрать 10 лучших

 

A если создать еще один файл с значениями расстояний между последовательностями.

1) Смотрим сколько последовательностей мы можем скачать и суммируем расстояние между ними (сохраняя промежуточные значения сумм)

2) Читаем в оперативку из файла это расстояние

3) Запускаем для каждой последовательности алгоритм поиска К  (знаем где начало последовательностей так как мы сохраняем подсуммы рассчитанные в п.1) 

4) снова начинаем пункт 1 продвинувшись немного вперед

 

 Что касается 10 лучших:

n - всего значений К, m - количество лучших. 

1) можно найти все К потом с помощью структуры данных куча выбрать нужное количество лучших (Получение кучи  О(n), выбор лучшего О(log n)  количество раз  m, место занимаемое в памяти - n)

2) сразу посчитать нужное количество - m шт (10 например), отсортировать их, и бинарным поиском искать место вставки остальных К.

(первичная сортировка O(m*log m), поиск вставки О(log m) количество раз (n-m), вставка О(1), место занимаемое в памяти - m) 

 
Urain:
Рекурсия на таких размерностях упадёт по превышению лимита кеша.
При классической рекурсии размер кэша фиксированный.
 
ALXIMIKS:
 

3) В среднем размер последовательности 20/10^6 = 20 Мб, то что загрузим полностью одну последовательность мы можем гарантировать?

Кстати да, можно загружать сразу пачки последовательностей.
 

Чувствую что не могу уловить сути в целом что надо и что дано (((

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

и да 20/10^6 = 20 Кб  ведь 1гб = 1000 мб = 10^6 кб 

 
YuraZ:

Если идти в сторону SQL 


  • Относительно новая для меня среда (плотно не работал, только базовые запросы);

Это может достаточно тормознуть  на этапе освоения.

Если выбрать этот вариант лучше построить всю бизнес логику  хранимыми процедурами

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

все расчеты на сервере

  • Сложность инсталляции на отдельно взятой клиентской машине (автономный вариант);

На самом деле в сети можно найти много описаний как поставить SQL сервер

    ( ORACL,SYBASE  +  CENTOS например )  ORACL,SYBASE,MS SQL+WINDOWS отдельная машина

   ORACL - чуть сложнее в освоении - меньше специалистов ,меньше литературы

   MS SQL - пожалуй больше всего в сети информации  и больше литературы

   особых трудностей тут не будет - в инете достаточно много описаний в магазине больше книг

   MSSQL 2012 по своим параметрам приблизился вплотную к ORACL - уже есть 2014

   Выбор связки SQL + LINUX  обычно выбирают в промышленной эксплуатации - и если нет познаний в LINUX лучше взять WINDOWS

MSSQL Expres шара но ограничения использует 1 ядро, 1Гб памяти, и 10Гб база

остальные платные. 

 
komposter:
...

Есть много однотипных последовательностей сделок, каждая последовательность отсортирована по времени.

Сделки в разных последовательностях разные, по времени распределены неравномерно (и в каждой последовательности по своему). Сделок разное количество. Но все - в интервале от Даты1 до Даты2.

Задача - двигаясь от Д1 до Д2 с шагом М минут (а лучше - конкретно по точкам совершения сделок всех последовательностей), находить последовательность, которая лучше остальных по критерию К (отдельная задача - не просто находить лучшую последовательность, а сортировать все множество по критерию и выводить 10 лучших - но это факультатив, пока не обязательно).

...

Не понимаю где то.

Вот есть критерий - все - в интервале от Даты1 до Даты2.

komposter:

Все так.

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

И так еще миллион раз =) 

Т. е., читается следующая.

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

 
Silent:

Не понимаю где то.

Вот есть критерий - все - в интервале от Даты1 до Даты2.

Т. е., читается следующая.

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

Видимо одним из результатов прохода с одной датой является новая дата.
 

если задача такая: 

дан ряд 1 2 3 4 5 6 7 8 9

дана ширина например 4, нужно двигаясь с этой шириной по по всему ряду находить какое-то там значение внутри ширины (на пример минимум):

вначале нужно найти в   1 2 3 4 потом  2 3 4 5 потом 3 4 5 6 потом  4 5 6 7 потом .... итд.

то задача решается с помощью поддержания минимума в структуре данных очередь: 

1) реализацию этого на видеокурсах маил.ру предлагали делать через четыре структуры данных стек

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