微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

并行读取多个文件并提取数据

如何解决并行读取多个文件并提取数据

我有 1000 个 import unittest from src.metrics_manager import MetricsManager def create_instance(): x = MetricsManager('foo.txt','bar.txt') class MyTestCase(unittest.TestCase): def test_something(self): self.assertRaises(ValueError,create_instance()) if __name__ == '__main__': unittest.main() 文件。我想同时阅读它们。我有 jsoncpu 内核。

我有一个字符向量,其中所有文件名称如下:-

4

并使用此 cik_files <- list.files("./data/",pattern = ".json") 加载文件提取数据并将其添加到以下列表中:-

vector

以下是提取数据的代码:-

data <- list()

然而,这需要相当多的时间。所以我想知道如何在 for 循环中并行运行代码

提前致谢。

解决方法

这里尝试解决问题中的问题。未经测试,因为没有数据。

步骤 1

首先,将问题中的循环重写为函数。

f <- function(i,path = "./data",cik_files){
  filename <- file.path(path,cik_files[i])
  data1 <- fromJSON(filename,flatten = TRUE)
  if(("NetIncomeLoss" %in% names(data1$facts$`us-gaap`))){
    data1 <- data1$facts$`us-gaap`$NetIncomeLoss$units$USD
    found <- grep("CY20[0-9]{2}$",data1$frame)
    if(length(found) > 0){
      tryCatch({
        out <- data1[found,c(3,9)]
        out$cik <- strtrim(cik_files[i],13)
        out
      },error = function(e) e,warning = function(w) w)
    } else NULL
  } else NULL
}

步骤 2

现在加载包 parallel 并运行以下其中一项,具体取决于操作系统。

library(parallel)

# Not on Windows
library(jsonlite)
json_list <- mclapply(seq_along(cik_files),f,cik_files = cik_files)

# Windows
ncores <- detectCores()
cl <- makeCluster(ncores - 1L)
clusterExport(cl,"cik_files")
clusterEvalQ(cl,library(jsonlite))

json_list <- parLapply(cl,seq_along(cik_files),cik_files = cik_files)

stopCluster(cl)

步骤 3

从返回的列表json_list中提取数据。

err <- sapply(json_list,inherits,"error")
warn <- sapply(json_list,"warning")
ok <- !(err | warn)
json_list[ok]  # correctly read in

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。