- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
基于上一个问题 ( see here ),我试图通过 xmlEventParse 读取许多大型 xml 文件,同时保存节点变化数据。使用此示例 xml:https://www.nlm.nih.gov/databases/dtd/medsamp2015.xml .
下面的代码使用 xpathSapply 来提取必要的值和一系列 if 语句,以将唯一值 (PMID) 与记录中的每个非唯一值 (LastName) 匹配的方式组合这些值 - 对于其中可能没有姓氏。目标是在此过程中编写一系列小型 csv(此处,在每 1000 个姓氏之后)以最大限度地减少内存使用量。
当在全尺寸数据集上运行时,代码成功地批量输出文件,但是内存中仍然存储着一些东西,一旦所有 RAM 被使用,最终会导致系统错误。我在代码运行时观察了任务管理器,可以看到 R 的内存随着程序的进行而增长。如果我在运行中停止程序然后清除 R 工作区,包括隐藏的项目,内存似乎仍在被 R 使用。直到我关闭 R 内存才再次释放。
自己运行几次,您会发现即使在清理工作区后,R 的内存使用量也会增加。
求助!对于以这种方式阅读大型 XML 文件的其他人来说,这个问题似乎很常见(参见示例评论 in this question)。
我的代码如下:
library(XML)
filename <- "~/Desktop/medsamp2015.xml"
tempdat <- data.frame(pmid=as.numeric(),
lname=character(),
stringsAsFactors=FALSE)
cnt <- 1
branchFunction <- function() {
func <- function(x, ...) {
v1 <- xpathSApply(x, path = "//PMID", xmlValue)
v2 <- xpathSApply(x, path = "//Author/LastName", xmlValue)
print(cbind(c(rep(v1,length(v2))), v2))
#below is where I store/write the temp data along the way
#but even without doing this, memory is used (even after clearing)
tempdat <<- rbind(tempdat,cbind(c(rep(v1,length(v2))), v2))
if (nrow(tempdat) > 1000){
outname <- paste0("~/Desktop/outfiles",cnt,".csv")
write.csv(tempdat, outname , row.names = F)
tempdat <<- data.frame(pmid=as.numeric(),
lname=character(),
stringsAsFactors=FALSE)
cnt <<- cnt+1
}
}
list(MedlineCitation = func)
}
myfunctions <- branchFunction()
#CHẠY
xmlEventParse(
file = filename,
handlers = NULL,
branches = myfunctions
)
câu trả lời hay nhất
这是一个示例,我们有一个启动脚本 invoke.sh
,它调用 R 脚本并将 url 和文件名作为参数传递...在这种情况下,我之前已经下载了测试文件 medsamp2015.xml并放入./data
Mục lục.
invoke.sh
脚本中创建一个循环并遍历目标文件名列表。对于调用 R 实例的每个文件,下载它,处理文件并继续下一个。 警告:我没有针对任何其他下载文件和格式检查或更改您的功能。我将通过删除第 62 行的 print() 包装器来关闭输出的打印。
print( cbind(c(rep(v1, length(v2))), v2))
.csv
文件放在 ./data
目录中。Để ý:这是我之前就此主题提供的答案的派生词: R memory not released in Windows .我希望它通过示例有所帮助。
1 #!/usr/local/bin/bash -x
2
3 R --no-save -q --slave < ./47162861.R --args "https://www.nlm.nih.gov/databases/dtd" "medsamp2015.xml"
47162861.R
# Set working directory
projectDir <- "~/dev/stackoverflow/47162861"
setwd(projectDir)
# -----------------------------------------------------------------------------
# Load required Packages...
requiredPackages <- c("XML")
ipak <- function(pkg) {
new.pkg <- pkg[!(pkg %in% installed.packages()[, "Package"])]
if (length(new.pkg))
install.packages(new.pkg, dependencies = TRUE)
sapply(pkg, require, character.only = TRUE)
}
ipak(requiredPackages)
# -----------------------------------------------------------------------------
# Load required Files
# trailingOnly=TRUE means that only your arguments are returned
args <- commandArgs(trailingOnly = TRUE)
if ( length(args) != 0 ) {
dataDir <- file.path(projectDir,"data")
fileUrl = args[1]
fileName = args[2]
} khác {
dataDir <- file.path(projectDir,"data")
fileUrl <- "https://www.nlm.nih.gov/databases/dtd"
fileName <- "medsamp2015.xml"
}
# -----------------------------------------------------------------------------
# Download file
# Does the directory Exist? If it does'nt create it
if (!file.exists(dataDir)) {
dir.create(dataDir)
}
# Now we check if we have downloaded the data already if not we download it
if (!file.exists(file.path(dataDir, fileName))) {
download.file(fileUrl, file.path(dataDir, fileName), method = "wget")
}
# -----------------------------------------------------------------------------
# Now we extrat the data
tempdat <- data.frame(pmid = as.numeric(), lname = character(),
stringsAsFactors = FALSE)
cnt <- 1
branchFunction <- function() {
func <- function(x, ...) {
v1 <- xpathSApply(x, path = "//PMID", xmlValue)
v2 <- xpathSApply(x, path = "//Author/LastName", xmlValue)
print(cbind(c(rep(v1, length(v2))), v2))
# below is where I store/write the temp data along the way
# but even without doing this, memory is used (even after
# clearing)
tempdat <<- rbind(tempdat, cbind(c(rep(v1, length(v2))),
v2))
if (nrow(tempdat) > 1000) {
outname <- file.path(dataDir, paste0(cnt, ".csv")) # Create FileName
write.csv(tempdat, outname, row.names = F) # Write File to created directory
tempdat <<- data.frame(pmid = as.numeric(), lname = character(),
stringsAsFactors = FALSE)
cnt <<- cnt + 1
}
}
list(MedlineCitation = func)
}
myfunctions <- branchFunction()
# -----------------------------------------------------------------------------
# RUN
xmlEventParse(file = file.path(dataDir, fileName),
handlers = NULL,
branches = myfunctions)
~/dev/stackoverflow/47162861/data/medsamp2015.xml
$ ll
total 2128
drwxr-xr-x@ 7 hidden staff 238B Nov 10 11:05 .
drwxr-xr-x@ 9 hidden staff 306B Nov 10 11:11 ..
-rw-r--r--@ 1 hidden staff 32K Nov 10 11:12 1.csv
-rw-r--r--@ 1 hidden staff 20K Nov 10 11:12 2.csv
-rw-r--r--@ 1 hidden staff 23K Nov 10 11:12 3.csv
-rw-r--r--@ 1 hidden staff 37K Nov 10 11:12 4.csv
-rw-r--r--@ 1 hidden staff 942K Nov 10 11:05 medsamp2015.xml
> ./invoke.sh > runtime.txt
+ R --no-save -q --slave --args https://www.nlm.nih.gov/databases/dtd medsamp2015.xml
Loading required package: XML
tài liệu:runtime.txt
关于R:巨大(> 20GB)文件的xmlEventParse期间的内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47162861/
Tôi đang chuyển từ Stata sang R (gói plm) cho kinh tế lượng mô hình bảng. Trong Stata, các mô hình bảng (chẳng hạn như hiệu ứng ngẫu nhiên) thường báo cáo trong nhóm, giữa các nhóm và bình phương R tổng thể. Tôi đã tìm thấy hiệu ứng ngẫu nhiên plm
đóng cửa. Câu hỏi này không tuân thủ các nguyên tắc của Stack Overflow. Hiện tại nó không chấp nhận câu trả lời. Bạn muốn cải thiện câu hỏi này? Đã cập nhật câu hỏi theo chủ đề cho Stack Overflow. Đóng cửa 6 năm trước Cải thiện câu hỏi này
Tôi muốn yêu cầu người dùng nhập danh sách các giá trị nguyên. Người dùng có thể nhập một giá trị hoặc một tập hợp nhiều giá trị như 1 2 3 (cách nhau bằng dấu cách hoặc dấu phẩy) rồi sử dụng dữ liệu đã nhập để tính toán thêm. Tôi đang sử dụng mã sau EXP <- as.integer(rea
Khi R thực hiện hồi quy bằng cách sử dụng các biến phân loại, đó thực sự là mã hóa giả. Nghĩa là, một cấp độ được bỏ qua làm cơ sở hoặc tham chiếu và công thức hồi quy bao gồm các biến giả cho tất cả các cấp độ khác. Nhưng R chọn cái nào làm tham chiếu và làm cách nào tôi có thể tác động đến lựa chọn này? Có bốn cấp độ
Câu hỏi này về cơ bản là phần mở rộng của câu hỏi tôi đã hỏi trước đây: Làm cách nào để chỉ in mô hình hồi quy R (đã điều chỉnh)? Tôi muốn xây dựng mô hình hồi quy tuyến tính để dự đoán một mô hình có 15
Tôi đã cài đặt R trên máy tính Linux có cài đặt một số gói. Bây giờ tôi đang thiết lập R trên một máy tính Linux khác. Cài đặt R từ kho lưu trữ của họ rất dễ dàng, nhưng tôi sẽ phải cài đặt nhiều gói bằng install.package
Tôi đang đọc Lập trình R nâng cao của Hadley và khi thảo luận về kích thước bộ nhớ của các ký tự, nó cho biết: R có một nhóm chuỗi chung. Điều này có nghĩa là mỗi chuỗi duy nhất.
Chúng ta có thể viết mã Shiny thành hai tệp riêng biệt, "ui.R" và "server.R" hoặc chúng ta có thể viết hai mô-đun vào một tệp "app.R" và gọi hàm ShinyApp() trên cả hai mô-đun này phương pháp
Tôi đang sử dụng R để lập trình di truyền thông qua gói RGP. Môi trường tạo ra khả năng giải quyết vấn đề. Tôi muốn giữ các hàm này trong các tệp nguồn .R của riêng chúng. Cả đời tôi không thể biết mình phải làm gì. Một cách tôi đã thử là: bf_str = print(b
Giả sử tôi tạo một hàm "function.r" và sau khi chỉnh sửa hàm, tôi phải tải lại nó vào môi trường toàn cầu của mình thông qua source('function.r'). Có cách nào để tôi có thể tránh tải lại nó vào
Ví dụ: test.R là một tệp một dòng: $ cat test.R # print('Hello, world!') Chúng ta có thể sử dụng Rscript test.R hoặc R CMD BATCH test.R
Tôi biết tôi có thể sử dụng Rmd để tạo hình minh họa gói, nhưng tôi tự hỏi liệu tôi có thể sử dụng R Notebook cụ thể hơn để tạo hình minh họa gói hay không. Nếu vậy, tôi có cần phải làm gì khác để viết sổ ghi chép R dưới dạng họa tiết gói không? Tôi đang sử dụng phiên bản mới nhất
Tôi đang xem xét sử dụng thư viện chia sẻ của gói R để cài đặt trang R. Nhiều máy tính sẽ truy cập vào thư viện để mọi người chia sẻ cùng một cài đặt. Vấn đề là tôi nhận thấy rằng đôi khi bạn không thể cập nhật các gói vì một phiên bản R khác đang khóa thư viện. Tôi không thể yêu cầu mọi người tắt R của nó
Tôi biết cách khởi động R từ dòng lệnh và thực thi một biểu thức (ví dụ: R -e 'print("hello")' ) hoặc nhận đầu vào từ một tệp (ví dụ: R -f filename.r ). Tuy nhiên, trong cả hai trường hợp, R đều chạy tệp
Tôi đang cố gắng làm cho dự án hiện tại của mình có thể tái tạo được, vì vậy tôi đang tạo một tài liệu chính (cuối cùng là tệp .rmd) để gọi và thực thi một số tài liệu khác. Bằng cách này, tôi và các nhà điều tra khác chỉ phải mở và chạy một tệp. Thiết lập hiện tại được chia thành ba cấp độ: tệp chính, 2 trình đọc
đóng cửa. Câu hỏi này không tuân thủ các nguyên tắc của Stack Overflow. Hiện tại nó không chấp nhận câu trả lời. Bạn muốn cải thiện câu hỏi này? Đã cập nhật câu hỏi theo chủ đề cho Stack Overflow. Đóng cửa 5 năm trước. Cải thiện câu hỏi này
Gói R của tôi có tệp mô tả sau Gói: blah Tiêu đề: Gói làm gì (một dòng, viết hoa tiêu đề) Phiên bản: 0.0.0.9000
Có cách nào để viết câu lệnh sau hiệu quả hơn không? accel là một khung dữ liệu. accel[[2]]<- accel[[2]]-weighted.mean(accel[[2]]) accel[[3]]<- accel[[
Ví dụ: khi cố gắng cài đặt gói R với Curl làm phần phụ thuộc, hãy sử dụng: * cài đặt *source* gói 'curl' ... ** gói 'curl' thành công
Tôi muốn chia sẻ một số phần mềm dưới dạng một gói, nhưng một số tập lệnh của tôi dường như không chạy tự nhiên như các hàm. Ví dụ: hãy xem xét khối mã sau, trong đó "raw.df" là khung dữ liệu chứa các biến loại rời rạc và liên tục. Hàm "count.unique" và "squa"
Tôi là một lập trình viên xuất sắc, rất giỏi!