Sau khi nhận được help từ 2 quý ông tốt bụng, tôi đã quản lý chuyển sang bảng dữ liệu từ khung dữ liệu + plyr.R - Tại sao thêm 1 cột vào bảng dữ liệu gần gấp đôi bộ nhớ cao nhất được sử dụng?
Tình hình và câu hỏi của tôi
Như tôi đã làm việc trên, tôi nhận thấy rằng đỉnh sử dụng bộ nhớ tăng gần gấp đôi từ 3.5GB đến 6.8GB (theo Windows Task Manager) khi tôi thêm 1 cột mới sử dụng :=
vào tập dữ liệu của tôi chứa ~ 200 nghìn hàng theo cột 2,5K.
Sau đó tôi đã thử 200M hàng 25 col, tăng từ 6GB lên 7,6GB trước khi giảm xuống 7,25 GB sau gc()
.
Cụ thể về cách thêm các cột mới, Matt Dowle mình đề cập here rằng:
Với nó: = điều hành bạn có thể:
Add columns by reference Modify subsets of existing columns by reference, and by group by reference Delete columns by reference
Không ai trong số các hoạt động sao chép (có khả năng lớn) dữ liệu .table tại tất cả, thậm chí không một lần.
Câu hỏi 1: Tại sao sẽ thêm một cột duy nhất của 'NA' cho một DT với 2.5K cột đôi bộ nhớ đỉnh sử dụng nếu data.table không được sao chép ở tất cả?
Câu hỏi 2: Tại sao tăng gấp đôi không xảy ra khi DT là 200M x 25? Tôi đã không bao gồm các màn hình in cho điều này, nhưng cảm thấy tự do để thay đổi mã của tôi và thử.
Printscreens cho sử dụng bộ nhớ sử dụng thử nghiệm Mã
sạch tái khởi động, RStudio & MS Word mở - 103MB sử dụng
Aft chạy mã tạo DT nhưng trước khi thêm cột - 3.5GB được sử dụng
Sau thêm 1 Cột đầy NA, nhưng trước gc() - 6.8GB được sử dụng
Sau khi chạy gc() - 3.5GB sử dụng
Kiểm tra Mã
Tổ chức điều tra, tôi đã lên mã kiểm tra sau đó bắt chước chặt chẽ bộ dữ liệu của tôi:
library(data.table)
set.seed(1)
# Credit: Dirk Eddelbuettel's answer in
# https://stackoverflow.com/questions/14720983/efficiently-generate-a-random-sample-of-times-and-dates-between-two-dates
RandDate <- function(N, st="2000/01/01", et="2014/12/31") {
st <- as.POSIXct(as.Date(st))
et <- as.POSIXct(as.Date(et))
dt <- as.numeric(difftime(et,st,unit="sec"))
ev <- runif(N, 0, dt)
rt <- as.character(strptime(st + ev, "%Y-%m-%d"))
}
# Create Sample data
TotalNoCol <- 2500
TotalCharCol <- 3
TotalDateCol <- 1
TotalIntCol <- 600
TotalNumCol <- TotalNoCol - TotalCharCol - TotalDateCol - TotalIntCol
nrow <- 200000
ColNames = paste0("C", 1:TotalNoCol)
dt <- as.data.table(setNames(c(
replicate(TotalCharCol, sample(state.name, nrow, replace = T), simplify = F),
replicate(TotalDateCol, RandDate(nrow), simplify = F),
replicate(TotalNumCol, round(runif(nrow, 1, 30), 2), simplify = F),
replicate(TotalIntCol, sample(1:10, nrow, replace = T), simplify = F)),
ColNames))
gc()
# Add New columns, to be run separately
dt[, New_Col := NA ] # Additional col; uses excessive memory?
Nghiên cứu Xong
Tôi không tìm thấy quá nhiều cuộc thảo luận trên bản ghi nhớ ry sử dụng cho DT với nhiều cột, chỉ this nhưng thậm chí sau đó, nó không cụ thể về bộ nhớ.
Hầu hết các cuộc thảo luận về tập dữ liệu lớn + sử dụng bộ nhớ liên quan đến DT với số lượng rất lớn nhưng tương đối ít cột.
My System
Intel i7-4700 với 4-core/8 sợi; RAM DDR3-12800 16 GB; Windows 8.1 64 bit; Ổ cứng 500GB 7200 vòng/phút; 64-bit R; Bảng dữ liệu ver 1.9.4
Phủ nhận
Hãy tha thứ cho tôi sử dụng một 'phi-R' phương pháp (ví dụ: Task Manager) để đo bộ nhớ sử dụng. Việc đo lường/lược tả bộ nhớ trong R là thứ mà tôi vẫn chưa tìm ra.
Chỉnh sửa 1: Sau khi cập nhật lên bảng dữ liệu ver 1.9.5 và chạy lại. Vấn đề vẫn tồn tại, thật không may.
Bạn có thể sử dụng '? Tables' để kiểm tra mức sử dụng bộ nhớ của' data.table'. Tôi nhận được '3,358MB' trước cột cuối cùng và' 3,359MB' sau khi thêm cột đó. – shadow
@shadow, tôi nghĩ bạn có nghĩa là 'bảng()' và cảm ơn vì đã làm nổi bật chức năng này với tôi - tôi không biết nó trước đây. Tôi đã đi qua các mô tả chức năng, nó xuất hiện để báo cáo bộ nhớ cuối cùng được sử dụng bởi DT, không phải bộ nhớ tối đa được sử dụng trong quá trình xử lý (tức là bao gồm cả bộ nhớ làm việc). Bạn không chắc chắn cách những con số này liên quan đến những con số được báo cáo bởi Trình quản lý tác vụ.Nêu tôi sai vui long chân chỉnh tôi. – NoviceProg
Fyi, '? Bảng' sẽ đưa bạn đến trang trợ giúp, vì vậy đó là cố ý. Tương tự, bạn có thể gõ '? Truelength' để biết thông tin về cách xử lý bộ nhớ data.tables. – Frank