【发布时间】:2018-11-17 23:27:32
【问题描述】:
我有以下file,其中包含 URL。想法是从 URL 下载图像,获取 6 个调色板,获取颜色名称和百分比,并将它们全部绑定到产品编号旁边的列表中。但我收到“文件太多”错误。
library(readxl)
library(jpeg)
library(scales)
library(plotrix)
library(gridExtra)
library(dplyr)
library(data.table)
dataset = read_excel("C:/Temp/Product.xlsx", sheet = "All")
datalist = list()
nRowsDf <- nrow(dataset)
avector <- as.vector(dataset$URL)
varenummer <- as.vector(dataset$Varenr)
for (i in 1:nRowsDf) {
tryCatch({
#Convert this from Data.frame to Vector
Sku <- as.vector(varenummer[[i]])
download.file(avector[[i]], paste(Sku,".jpg" ,sep = ""), mode = "wb")
painting <- readJPEG(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 array into RGB Channels
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 # iteration
datalist[[i]] <- Final # add iteration to list
big_data = rbindlist(datalist)
#grid.table(big_data)
write.table(big_data, file = "myDF.csv", sep = ",", col.names = TRUE, append = TRUE)
#R = Final[with(Final, order(-Percentage)),]
}, error = function(e) { closeAllConnections() })
closeAllConnections()
}
下载大约 266 张独特的 JPEG 图像后代码停止。
此代码仅下载 JPG 文件,如果返回另一种文件类型,它将直接忽略它。
错误:
Error in file(file, ifelse(append, "a", "w")) :
cannot open the connection
In addition: Warning message:
In file(file, ifelse(append, "a", "w")) :
cannot open file 'myDF.csv': Too many open files
如果我删除 trycatch 我会得到这些:
Error in download.file(avector[[i]], "image.jpg", mode = "wb") :
cannot open destfile 'image.jpg', reason 'Too many open files'
【问题讨论】:
-
深夜阅读这段代码已经太晚了。但我的建议是在读入文件后明确关闭每个连接。请参阅
?file了解有关此的大量详细信息。第二个想法是 3.5 版本遇到了一些可能与您的问题有关的问题。如果我没记错的话,这些可能相关的问题已经在开发版本中解决了。 R 3.5.1 计划在 7 月的第一周发布。 -
如果您不需要保存文件,您可以使用
tempfile(fileext=".jpg")而不是 image.jpg 以避免可能用虚拟名称覆盖新文件。我不知道这是否能解决您的具体问题。 -
看起来好像代码的某些部分正在打开连接但忘记关闭它。我在您发布的代码中没有看到这一点,因此它可能是其中一个 R 函数中的错误。一个可能的候选者是
file()在错误消息中调用。traceback()显示了什么关于它的调用位置? -
其实,它可能发生得更早,但是被你的
tryCatch压制了。尝试不使用它运行,或者至少在捕获错误时打印消息和一些诊断信息。 -
> traceback() 2: file(file, ifelse(append, "a", "w")) 1: write.table(big_data, file = "myDF.csv", sep = " , ", col.names = T, append = T) >
标签: r for-loop rstudio k-means rtvs