循环URL R打开的文件太多

循环URL R打开的文件太多,r,for-loop,rstudio,k-means,rtvs,R,For Loop,Rstudio,K Means,Rtvs,我有以下与网址在它。我们的想法是从URL下载图像,获得一个6色调色板,获得颜色名称和百分比,并将它们与产品编号一起绑定到一个列表中。但是我得到了“文件太多”的错误 如果我删除trycatch,我会得到以下结果: Error in download.file(avector[[i]], "image.jpg", mode = "wb") : cannot open destfile 'image.jpg', reason 'Too many open files' 该代码有一个错误,或者更好地

我有以下与网址在它。我们的想法是从URL下载图像,获得一个6色调色板,获得颜色名称和百分比,并将它们与产品编号一起绑定到一个列表中。但是我得到了“文件太多”的错误

如果我删除trycatch,我会得到以下结果:

Error in download.file(avector[[i]], "image.jpg", mode = "wb") : 
cannot open destfile 'image.jpg', reason 'Too many open files'

该代码有一个错误,或者更好地说是一个不必要的步骤,即保持打开的连接,直到达到“文件”施加的限制

通过简单地删除迭代步骤和rbind数据列表,它可以完美地运行

下面是修改后的版本

for (i in 1:nRowsDf) {
tryCatch({
    #Convert this from Data.frame to Vector

    Sku <- as.vector(varenummer[[i]]) #for testing use 23406
    download.file(avector[[i]], paste(Sku, ".jpg", sep = ""), mode = "wb")
    # painting <- readJPEG(paste(Sku,".jpg" ,sep = ""))

    painting = load.image(paste(Sku, ".jpg", sep = ""))
    dimension <- dim(painting)
    painting_rgb <- data.frame(
  x = rep(1:dimension[2], each = dimension[1]),
  y = rep(dimension[1]:1, dimension[2]),
  R = as.vector(painting[,, 1]), #slicing our array into three
  G = as.vector(painting[,, 2]),
  B = as.vector(painting[,, 3])
)


    k_means = kmeans(painting_rgb[, c("R", "G", "B")], algorithm = "Lloyd", centers = 6, iter.max = 300)
test = (sapply(rgb(k_means$centers), color.id))

    Color = lapply(test, `[[`, 1)
Values = k_means$size
Percentage = k_means$size / sum(k_means$size)
Final = do.call(rbind, Map(data.frame, Color = lapply(test, `[[`, 1), Values =     k_means$size, ProductNumber = Sku, Percentage = Percentage))
    #Final$i <- i # maybe you want to keep track of which iteration produced it?
    #datalist[[i]] <- Final # add it to your list
    #big_data = rbindlist(datalist)
    #grid.table(big_data)
    write.table(Final, file = "myDF.csv", sep = ",", col.names = TRUE, append = TRUE)


    #R = Final[with(Final, order(-Percentage)),]
}, error = function(e) { closeAllConnections() })
 closeAllConnections()

}
for(1中的i:nRowsDf){
tryCatch({
#将其从Data.frame转换为Vector

Sku夜间读取此代码块已为时过晚。但我的建议是在中读取文件后显式关闭每个连接。请参阅
?file
,了解有关此问题的一系列详细信息。第二个想法是版本3.5遇到了一些可能与您的问题有关的问题。如果我没有记错,这些问题可能与您的问题有关开发版本中的问题已经解决。R 3.5.1计划在7月的第一周发布。如果不需要保存文件,可以使用
tempfile(fileext=“.jpg”)
而不是image.jpg,以避免可能用虚拟名称覆盖新文件。我不知道这是否能解决您的特定问题。代码的某些部分似乎正在打开连接,但忘记关闭连接。我在您发布的代码中没有看到这一点,因此可能是R函数中的一个错误。可能是Cidate是错误消息中的
file()
调用。
traceback()
显示了调用它的位置是什么?实际上,它可能发生在更早的时候,但被
tryCatch
抑制。请尝试在没有该调用的情况下运行,或者在捕获错误时至少打印消息和一些诊断信息。>traceback()2:file>(文件,ifelse(追加“a”,“w”))1:write.table(大数据,file=“myDF.csv”,sep=“,”,col.names=T,append=T)>
Error in download.file(avector[[i]], "image.jpg", mode = "wb") : 
cannot open destfile 'image.jpg', reason 'Too many open files'
for (i in 1:nRowsDf) {
tryCatch({
    #Convert this from Data.frame to Vector

    Sku <- as.vector(varenummer[[i]]) #for testing use 23406
    download.file(avector[[i]], paste(Sku, ".jpg", sep = ""), mode = "wb")
    # painting <- readJPEG(paste(Sku,".jpg" ,sep = ""))

    painting = load.image(paste(Sku, ".jpg", sep = ""))
    dimension <- dim(painting)
    painting_rgb <- data.frame(
  x = rep(1:dimension[2], each = dimension[1]),
  y = rep(dimension[1]:1, dimension[2]),
  R = as.vector(painting[,, 1]), #slicing our array into three
  G = as.vector(painting[,, 2]),
  B = as.vector(painting[,, 3])
)


    k_means = kmeans(painting_rgb[, c("R", "G", "B")], algorithm = "Lloyd", centers = 6, iter.max = 300)
test = (sapply(rgb(k_means$centers), color.id))

    Color = lapply(test, `[[`, 1)
Values = k_means$size
Percentage = k_means$size / sum(k_means$size)
Final = do.call(rbind, Map(data.frame, Color = lapply(test, `[[`, 1), Values =     k_means$size, ProductNumber = Sku, Percentage = Percentage))
    #Final$i <- i # maybe you want to keep track of which iteration produced it?
    #datalist[[i]] <- Final # add it to your list
    #big_data = rbindlist(datalist)
    #grid.table(big_data)
    write.table(Final, file = "myDF.csv", sep = ",", col.names = TRUE, append = TRUE)


    #R = Final[with(Final, order(-Percentage)),]
}, error = function(e) { closeAllConnections() })
 closeAllConnections()

}