如何解决并行读取多个文件并提取数据
我有 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()
文件。我想同时阅读它们。我有 json
个 cpu 内核。
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 举报,一经查实,本站将立刻删除。