Как использовать параллельные вычисления в R?

    sect<-c("Healthcare","Basic Materials","Utilities","Financial Services","Technology","Consumer" 
    "Defensive","Industrials","Communication Services","Energy","Real Estate","Consumer 
    Cyclical","NULL")

    mcap<-c("3 - Large","2 - Mid","1 - Small")

    df_total = data.frame()
    start <- as.Date("01-01-14",format="%d-%m-%y")
    end   <- as.Date("18-03-20",format="%d-%m-%y")
    theDate <- start

    while (theDate <= end){
      for (value1 in sect){
        for (value2 in mcap){
            date=theDate
            sector<-value1
            marketcap1<-value2
            newquery("Select * from table where date='%s' and sector='%s' and marketcap='%s'",date,sector,marketcap1)
   topdemo <- sqlQuery(dbhandle,newquery)
   df=data.frame(topdemo)
   df_total <- rbind(df_total,df)

     }
    }
   theDate <- theDate + 1 
   }

Вместо запроса «Выбрать» в моей программе я выполняю несколько вычислений SQL. Мне нужно, чтобы этот код работал с 2014 по 2020 год, но его выполнение занимает много времени. Есть ли способ уменьшить время выполнения? База данных содержит множество цен на акции для каждой рыночной капитализации и сектора.


person Theguy    schedule 19.03.2020    source источник
comment
Да. Избегайте select *. Выберите только те столбцы, которые вам нужны.   -  person AlwaysLearning    schedule 19.03.2020
comment
На самом деле я делаю много вычислений с данными. Команда Select была дана для справки. Программа в основном просматривает каждую дату с 2014 года, рыночную капитализацию и сектор и рассчитывает несколько вещей. Как сократить время?   -  person Theguy    schedule 19.03.2020


Ответы (1)


Запустите один запрос вместо всех циклов:

select *
from table
where sector in ('Healthcare', 'Basic Materials', 'Utilities',
                 'Financial Services', 'Technology', 'Consumer' 
                 'Defensive', 'Industrials', 'Communication Services', 'Energy', 'Real Estate', 'Consumer Cyclical', 'NULL'
                 ) and
        marketcap in ('3 - Large', '2 - Mid', '1 - Small') and
        date between '2014-01-01 and '2020-03-18';

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

Тем не менее, вы, кажется, перемещаете много данных. Интересно, нужно ли все это перемещение данных?

Странно, что вы перебираете тысячи дат, но не включаете дату в запрос.

person Gordon Linoff    schedule 19.03.2020
comment
Я включил дату в предложение where. Мне нужно проходить каждый день, чтобы вычислить определенные вещи. Я запускал программу 45 минут. Он выполнялся только до апреля 2014 года. - person Theguy; 19.03.2020
comment
@Чувак . . . Запустите один запрос, чтобы загрузить данные в кадр данных. Если затем вам нужно просмотреть данные, сделайте это в R. Обратите внимание, что если операции могут быть выражены в SQL, вероятно, лучше выполнять вычисления в базе данных. - person Gordon Linoff; 19.03.2020