У меня есть 15 миллионов файлов CSV, каждый из которых имеет два столбца (целое число и число с плавающей запятой) и от 5 до 500 строк. Каждый файл выглядит примерно так:
3453,0.034
31,0.031
567,0.456
...
В настоящее время я перебираю все файлы и использую read.csv()
для импорта каждого файла в большой список. Вот упрощенная версия:
allFileNames = Sys.glob(sprintf("%s/*/*/results/*/*", dir))
s$scores = list()
for (i in 1:length(allFileNames)){
if ((i %% 1000) == 0){
cat(sprintf("%d of %d\n", i, length(allFileNames)))
}
fileName = allFileNames[i]
approachID = getApproachID(fileName)
bugID = getBugID(fileName)
size = file.info(fileName)$size
if (!is.na(size) && size > 0){ # make sure file exists and is not empty
tmp = read.csv(fileName, header=F, colClasses=c("integer", "numeric"))
colnames(tmp) = c("fileCode", "score")
s$scores[[approachID]][[bugID]] = tmp
} else {
# File does not exist, or is empty.
s$scores[[approachID]][[bugID]] = matrix(-1, ncol=2, nrow=1)
}
}
tmp = read.csv(fileName, header=F, colClasses=c("integer", "numeric")
Позже в своем коде я возвращаюсь к каждой матрице в списке и вычисляю некоторые показатели.
Похоже, что после запуска этого процесса импорта он займет от 3 до 5 дней. Есть ли более быстрый способ сделать это?
РЕДАКТИРОВАТЬ: я добавил более подробную информацию о своем коде.