doParallel() и mySQL в R: база данных не получает данные

Я использую RMySQL() для отправки данных из R в базу данных MySQL. Проблема в том, что база данных не получает никаких данных.... Я использую doParallel(), так как выполняю более 4500 итераций.... может ли это быть из-за того, что я пытаюсь отправить данные в базу данных в функции pullSpread()?

library(RMySQL)
library(doParallel)
library(stringr)
library(foreach)

makeCluster(detectCores()) # ANSWER = 4
cl <- makeCluster(4, type="SOCK") # also used PSOCK & FORK but receive the same problem
registerDoParrallel(cl)

# Now use foreach() and %dopar% to pull data...
# the apply(t(stock1), 2, pullSpread) works but not "parallelized"
# I have also used clusterApply() but is unsuccessful
system.time(
foreach(a=t(stock1)) %dopar% pullSpread(a)
)

Когда я смотрю в свой рабочий каталог, все файлы успешно копируются в файл .csv, как и должно быть, но когда я проверяю рабочее место MySQL или даже вызываю файлы из R, они не существуют...

Вот вектор символов stock1() и используемая функция pullSpread()...

# This list contains more than 4500 iterations.. so I am only posting a few
stock1<-c(
  "SGMS.O","SGNL.O","SGNT.O",
  "SGOC.O","SGRP.O", ...) 

Важные даты, необходимые для работы:

Friday <- Sys.Date()-10

# Get Previous 5 days
Thursday <- Friday - 1
Wednesday <- Thursday -1
Tuesday <- Wednesday -1
Monday <- Tuesday -1

#Make Them readable for NetFonds 
Friday <- format(Friday, "%Y%m%d")
Thursday<- format(Thursday, "%Y%m%d")
Wednesday<- format(Wednesday, "%Y%m%d")
Tuesday<- format(Tuesday, "%Y%m%d")
Monday<-format(Monday, "%Y%m%d")

Вот функция pullSpread():

pullSpread = function (stock1){
AAPL_FRI<- read.delim(header=TRUE, stringsAsFactor=FALSE,
                    paste(sep="",
                          "http://www.netfonds.no/quotes/posdump.php?date=",
                          Friday,"&paper=",stock1,"&csv_format=txt"))

tryit <- try(AAPL_FRI[,c(1:7)])

if(inherits(tryit, "try-error")){

rm(AAPL_FRI)

} else {



AAPL_THURS<- read.delim(header=TRUE, stringsAsFactor=FALSE,
                      paste(sep="",
                            "http://www.netfonds.no/quotes/posdump.php?date=",
                            Thursday,"&paper=",stock1,"&csv_format=txt"))

AAPL_WED<- read.delim(header=TRUE, stringsAsFactor=FALSE,
                    paste(sep="",
                          "http://www.netfonds.no/quotes/posdump.php?date=",
                          Wednesday,"&paper=",stock1,"&csv_format=txt"))

AAPL_TUES<- read.delim(header=TRUE, stringsAsFactor=FALSE,
                     paste(sep="",
                           "http://www.netfonds.no/quotes/posdump.php?date=",
                           Tuesday,"&paper=",stock1,"&csv_format=txt"))

AAPL_MON<- read.delim(header=TRUE, stringsAsFactor=FALSE,
                    paste(sep="",
                          "http://www.netfonds.no/quotes/posdump.php?date=",
                          Monday,"&paper=",stock1,"&csv_format=txt"))


SERIES <- rbind(AAPL_MON,AAPL_TUES,AAPL_WED,AAPL_THURS,AAPL_FRI)

#Write .CSV File
write.csv(SERIES,paste(sep="",stock1,"_",Friday,".csv"), row.names=FALSE) 
dbWriteTable(con2,paste0( "",str_sub(stock1, start = 1L, end = -3L),""),paste0(   
"~/Desktop/R/",stock1,"_",Friday,".csv"), append=T)
}
}

person Rime    schedule 14.07.2014    source источник
comment
При чем здесь база данных MySQL? Вы читаете и объединяете файлы с разделителями табуляции из Интернета.   -  person Richie Cotton    schedule 14.07.2014
comment
Также код на дни недели работает только по воскресеньям.   -  person Richie Cotton    schedule 14.07.2014
comment
@Richiecotton Я в основном отправляю информацию, записанную в файле .csv, в базу данных MySQL ближе к концу функции pullSpread. Даты корректируются для захвата с понедельника по пятницу путем ручной настройки... я обновил код, чтобы он отображал только будние дни.   -  person Rime    schedule 14.07.2014
comment
Вам нужно сделать небольшой тест, можете ли вы подключиться к базе данных. Забудьте о цикле; сделать это как можно проще.   -  person Richie Cotton    schedule 14.07.2014


Ответы (1)


Получите прошлую пятницу, используя что-то вроде этого:

Friday <- Sys.Date()
while(weekdays(Friday) != "Friday") 
{
  Friday <- Friday - 1
}

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

lastWeek <- format(Friday - 0:4, "%Y%m%d")
stockDatePairs <- expand.grid(Stock = stock1, Date = lastWeek)
urls <- with(
  stockDatePairs,
  paste0(
    "http://www.netfonds.no/quotes/posdump.php?date=",
    Date,
    "&paper=",
    Stock,
    "&csv_format=txt"
  )
)
for(url in urls)
{
  # or whatever file name you want
  download.file(url, paste0("data from ", make.names(url), ".txt"))
}

Убедитесь, что вы знаете, в какой каталог сохраняются эти файлы. (Либо укажите абсолютный путь, либо укажите рабочий каталог.)

Теперь попробуйте прочитать и rbindинг этих файлов.

Если это сработает, то вы можете попробовать делать что-то параллельно.

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

person Richie Cotton    schedule 14.07.2014
comment
Вау, спасибо, чувак, ты почистил много кода. Однако, когда я запускаю это, он возвращает первые пять итераций по пяти дням недели. другими словами, вместо 5 дней на итерацию у меня есть только один день на итерацию. - person Rime; 14.07.2014
comment
@Rime Я не заметил, что stock1 должен был быть вектором символов, а не одной строкой. Смотрите обновление. - person Richie Cotton; 15.07.2014
comment
Это примечание о разделении процесса загрузки и обработки данных должно быть выделено жирным шрифтом, мигающими, сияющими буквами, из которых вырастают единороги и раздвигают облака, пока смурфики не вспыхнут в песне и танце. Да, это такая экономия времени. - person Brandon Bertelsen; 14.10.2016