如果文件夹中的文件数超过10000,请在r中创建新的子文件夹

时间:2017-04-11 07:16:33

标签: r

我一直在使用moveudhttps://github.com/bacollier/moveud)一段时间,并且可能找到了为什么代码在某些时候运行缓慢的原因。

偶然我删除了文件夹"把它放回去#34;重命名后,代码再次加速。如果代码至少运行一天并随机产生错误(由于文件写入错误???),它现在运行不到一个小时!

所以我的问题是:

无论如何在代码中包含一个计数器,该计数器将产生一个新的子文件夹,例如: _1,_2等文件夹中的每个10000文件?

这是我的代码:

UD_subs5_ving13_split是move包中的产品,包含大约27000行,文件产品大约是该数字的4倍。

在我的情况下,我想要5个文件夹UDsubs5ving13_1到UDsubs5ving13_5。

是否可以将以下代码中的内容合并到下面代码的path=部分,例如使用paste

应该使用类似length(list.files("/path_to_files")的内容吗?

mclapply(UD_subs5_ving13_split, function(x){
  for(j in 4:nrow(x@DBMvar)){
    tryCatch({
      move.forud(x,
                 range.subset=j:nrow(x@DBMvar),
                 ts=1,
                 ras=20,lev=c(0.2,.5,.95),
                 le=20,
                 crs='+proj=longlat +zone=32 +datum=WGS84',
                 name=paste(names(x), "", sep = "_"),
                 ID=names(x),
                 **path="UDsubs5ving13"**)
    }, warning = function(w) {
      warning = paste(x@DBMvar@idData$trackId, "", sep = "_")
    }, error=function(e) {
      j = j + 2
    })
  }
}, mc.cores = 6)

1 个答案:

答案 0 :(得分:1)

我在这个答案中使用的逻辑是学习你有多少个子集。计算大约需要多少文件夹才能将1000个文件填入每个文件夹中。对于每个子集,预先计算此文件夹并将其粘贴在一起以便及时写入。此解决方案假定writeOGR正在创建文件夹。

move.forud=function(x, range.subset, ts, ras, le, lev, crs, path, name, ID) {
  object<-x@DBMvar
  if(length(range.subset)<2)
    stop("\nrange.subset must have length >1\n")
  if(length(le)==1) location.error=rep(c(le), nrow(object))
  if(length(le)>1)  location.error=c(le)

  # calculate number of subfolders needed to house 1000 files each
  num.subfolders <- ceiling(length(range.subset)/1000) 
  # create in advance to which subfolder shapefiles will be written to
  subfolder <- sprintf("/_%d", rep(1:num.subfolders, each = 1000))

  for(i in range.subset) {
    object@interest<-rep(F, nrow(object)); object@interest[i]<-T;times=object@timestamps[i];var=object@means[i];
    x.out <- brownian.bridge.dyn(object,raster=ras, time.step=ts, location.error=location.error)
    xx=raster2contour(x.out, level=lev)
    xx=spTransform(xx, CRS=CRS('+proj=longlat +datum=WGS84'))
    xx=SpatialLines2PolySet(xx)
    xx=PolySet2SpatialPolygons(xx)
    xx=as(xx, "SpatialPolygonsDataFrame")
    xx$levels=lev
    xx$times=times
    xx$stepvar=var
    xx$ID=ID

    writeOGR(xx, dsn=paste(path, subfolder[i], sep = ""), layer=paste(name, i, sep=""), driver="ESRI Shapefile")
  }
}