2015-02-05 14 views
8

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ã

  1. sạch tái khởi động, RStudio & MS Word mở - 103MB sử dụng 1. Clean re-boot, RStudio & MS Word opened

  2. Aft chạy mã tạo DT nhưng trước khi thêm cột - 3.5GB được sử dụng enter image description here

  3. Sau thêm 1 Cột đầy NA, nhưng trước gc() - 6.8GB được sử dụng enter image description here

  4. Sau khi chạy gc() - 3.5GB sử dụng enter image description here

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.

enter image description here

+0

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

+1

@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

+1

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

Trả lời

3

(Tôi có thể không có tín dụng như tâm trí DT lớn (Arun) đã làm việc về vấn đề này và thấy nó có liên quan đến print.data.table. Chỉ cần kết thúc vòng lặp vào đây để SO người dùng khác .)

có vẻ như vấn đề bộ nhớ data.table này với := đã được giải quyết trên phiên bản R 3.2 như đã nói bởi: https://github.com/Rdatatable/data.table/issues/1062

[Trích dẫn @Arun từ Github vấn đề 1062 ...]

cố định trong v3.2 R, IIUC, với mặt hàng này từ NEWS:

Auto-in không còn bản sao đối tượng khi in được cử đến một phương pháp.

Vì vậy, những người khác có vấn đề này nên nâng cấp lên R 3.2.

+1

Cảm ơn @micstr, tôi sạch quên tôi đăng vấn đề này trên SO. Tôi đã thử nghiệm nó vào cuối tuần và xác nhận vấn đề đã được giải quyết trong R3.2 cho Linux. * Disclaimer: Tôi đã chuyển sang sử dụng R trong Linux vì vậy đã không kiểm tra vấn đề trong Windows. – NoviceProg

Các vấn đề liên quan