2012-03-10 32 views
5

Chào buổi tối,Phân tích biểu đồ xã hội. 60GB và 100 triệu nút

Tôi đang cố gắng phân tích dữ liệu đã đề cập (định dạng edgelist hoặc pajek). Đầu tiên là R-project với gói igraph. Nhưng giới hạn bộ nhớ (6GB) sẽ không làm điều đó. Một PC 128GB có thể xử lý dữ liệu không? Có bất kỳ lựa chọn thay thế mà không yêu cầu toàn bộ đồ thị trong RAM?

Xin cảm ơn trước.

P.S: Tôi đã tìm thấy một số chương trình nhưng tôi muốn nghe một số ý kiến ​​chuyên nghiệp (vâng, đó là bạn) về vấn đề này.

+1

Khi bạn nói "phân tích", bạn có thể cụ thể hơn về những gì bạn đang cố gắng làm không? – ose

+0

Tất nhiên. Tôi muốn tính toán độ (trong, ngoài, tổng số), mà tôi sẽ sử dụng để vẽ các bản phân phối. Tôi muốn có thể di chuyển các nút và các cạnh từ đồ thị lớn đến các đồ thị nhỏ hơn (các quy trình lấy mẫu), trong đó add.vertices và add.edges từ igraph rất tiện dụng. –

+0

Định dạng dữ liệu là gì? Có phải là người dùng nhạc cụ đơn độc 60 GB không? (tức là nó là một tập tin văn bản mà mỗi hàng có chứa hai số đại diện cho người gửi và người nhận của một cạnh duy nhất?) –

Trả lời

6

Nếu bạn chỉ muốn phân phối cấp độ, bạn có thể không cần gói đồ thị. Tôi khuyên bạn nên bigtablulate package để

  1. đối tượng R của bạn đang tập tin sao lưu để bạn không bị giới hạn bởi RAM
  2. bạn có thể parallelize việc tính toán mức độ sử dụng foreach

Check-out their website để biết thêm chi tiết . Để đưa ra một ví dụ nhanh về cách tiếp cận này, trước tiên hãy tạo một ví dụ với một edgelist liên quan đến 1 triệu cạnh trong số 1 triệu nút.

set.seed(1) 
N <- 1e6 
M <- 1e6 
edgelist <- cbind(sample(1:N,M,replace=TRUE), 
        sample(1:N,M,replace=TRUE)) 
colnames(edgelist) <- c("sender","receiver") 
write.table(edgelist,file="edgelist-small.csv",sep=",", 
      row.names=FALSE,col.names=FALSE) 

Tôi kết nối lại tệp này 10 lần để làm ví dụ lớn hơn một chút.

system(" 
for i in $(seq 1 10) 
do 
    cat edgelist-small.csv >> edgelist.csv 
done") 

Tiếp theo, chúng tôi tải gói bigtabulate và đọc trong tệp văn bản với edgelist của chúng tôi. Lệnh read.big.matrix() tạo ra một đối tượng tập tin hậu thuẫn ở R.

library(bigtabulate) 
x <- read.big.matrix("edgelist.csv", header = FALSE, 
        type = "integer",sep = ",", 
        backingfile = "edgelist.bin", 
        descriptor = "edgelist.desc") 
nrow(x) # 1e7 as expected 

Chúng tôi có thể tính toán bằng cách sử dụng outdegrees bigtable() trên cột đầu tiên.

outdegree <- bigtable(x,1) 
head(outdegree) 

kiểm tra sự tỉnh táo nhanh để đảm bảo bảng đang làm việc như mong đợi:

# Check table worked as expected for first "node" 
j <- as.numeric(names(outdegree[1])) # get name of first node 
all.equal(as.numeric(outdegree[1]), # outdegree's answer 
      sum(x[,1]==j))    # manual outdegree count 

Để có được indegree, chỉ cần làm bigtable(x,2).

+0

Nếu tôi làm đúng, chúng tôi sẽ chuyển vấn đề sang ma trận tính toán. Tôi thích nó. Vui lòng cung cấp một ví dụ. –

+0

Dường như dễ dàng và có thể mở rộng để tính toán độ. Nó có thể xử lý đồ thị mannipulation? Thêm substracting vv? Tôi phải đọc tài liệu của họ. Cảm ơn bạn đã đăng Christopher. –

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