2011-11-02 29 views
26

Tôi quan tâm đến phân tích mạng trên các mạng lớn với hàng triệu nút và hàng chục triệu cạnh. Tôi muốn có thể làm những việc như phân tích các mạng từ nhiều định dạng, tìm các thành phần được kết nối, phát hiện cộng đồng và chạy các thước đo trọng tâm như PageRank.Các vấn đề về khả năng mở rộng nào được liên kết với NetworkX?

Tôi bị thu hút bởi NetworkX bởi vì nó có một api tốt đẹp, tài liệu tốt và đã được phát triển tích cực trong nhiều năm. Plus vì nó nằm trong python, nên nhanh chóng phát triển.

Trong một bài thuyết trình gần đây (các slide có sẵn trên github here), người ta khẳng định rằng:

Không giống như nhiều công cụ khác, NX được thiết kế để xử lý dữ liệu trên thang điểm từ liên quan đến vấn đề hiện đại .. Hầu hết các thuật toán cốt lõi trong NX dựa vào mã di sản cực nhanh.

Bản trình bày cũng nêu rõ rằng thuật toán cơ bản của NetworkX được triển khai trong C/Fortran.

Tuy nhiên, nhìn vào mã nguồn, có vẻ như NetworkX chủ yếu được viết bằng python. Tôi không quá quen thuộc với mã nguồn, nhưng tôi nhận thức được một vài ví dụ mà NetworkX sử dụng numpy để làm việc nâng hạng nặng (mà lần lượt sử dụng C/Fortran để làm đại số tuyến tính). Ví dụ, tập tin networkx/networkx/algorithms/centrality/eigenvector.py sử dụng numpy để tính toán eigenvectors.

Có ai biết nếu chiến lược này gọi một thư viện được tối ưu hóa như numpy thực sự phổ biến trong suốt NetworkX hay chỉ một vài thuật toán làm điều đó? Ngoài ra, bất cứ ai cũng có thể mô tả các vấn đề khả năng mở rộng khác liên quan đến NetworkX?

Trả lời từ NetworkX Chì Programmer tôi đặt ra câu hỏi này trên mailing list NetworkX, và Aric Hagberg trả lời:

Các cấu trúc dữ liệu được sử dụng trong NetworkX phù hợp với mở rộng quy mô để vấn đề lớn (ví dụ như cấu trúc dữ liệu là một danh sách kề). Thuật toán có các thuộc tính chia tỷ lệ khác nhau nhưng một số thuộc tính mà bạn đề cập có thể sử dụng được (ví dụ: PageRank, các thành phần được kết nối, là tuyến tính số phức tạp về số cạnh).

Tại thời điểm này NetworkX là mã Python thuần túy. Cấu trúc kề được mã hóa bằng các từ điển Python cung cấp tính linh hoạt tuyệt vời với chi phí bộ nhớ và tốc độ tính toán. Các đồ thị lớn sẽ mất rất nhiều bộ nhớ và cuối cùng bạn sẽ hết.

NetworkX sử dụng NumPy và SciPy cho các thuật toán chủ yếu là dựa trên đại số tuyến tính. Trong trường hợp đó, biểu đồ được biểu diễn (được sao chép) dưới dạng ma trận kề bằng cách sử dụng ma trận NumPy hoặc SciPy ma trận thưa thớt. Những thuật toán này có thể được hưởng lợi từ mã C và FORTRAN cũ được sử dụng dưới mui xe trong NumPy và SciPY.

+0

Có vẻ như tôi gặp sự cố khi tự kiểm tra nguồn tại thời điểm này. Nhưng trong mọi trường hợp, hãy xem xét: 80% thời gian có thể được chi tiêu bằng 20% ​​mã. Mercurial được viết * chủ yếu * bằng Python, nhưng tôi chưa từng nghe một người phàn nàn về tốc độ của nó so với Git, chủ yếu là C. – delnan

+0

Vâng, nhưng tôi cũng lo lắng về trí nhớ. Biểu diễn biểu đồ trong networkx là một thư viện python. Điều đó có nghĩa là tôi chỉ có thể phù hợp với các đồ thị nhỏ hơn vào bộ nhớ? – conradlee

Trả lời

14

Vấn đề lớn của bạn sẽ là bộ nhớ. Python chỉ đơn giản là không thể xử lý hàng chục triệu đối tượng, mà không cần nhảy qua các vòng trong quá trình triển khai lớp học của bạn. Chi phí bộ nhớ của nhiều đối tượng quá cao, bạn nhấn 2GB và mã 32 bit sẽ không hoạt động. Có những cách xung quanh nó - sử dụng các khe, mảng hoặc vón cục. Nó nên là OK, bởi vì networkx đã được viết cho hiệu suất, nhưng nếu có một vài điều mà chỉ cần không làm việc tôi sẽ kiểm tra việc sử dụng bộ nhớ của bạn.

Để mở rộng quy mô, thuật toán về cơ bản là thứ duy nhất quan trọng với biểu đồ. Thuật toán đồ thị có xu hướng có số thực sự là tỷ lệ xấu xí nếu chúng được thực hiện sai và chúng có khả năng được thực hiện ngay trong Python như bất kỳ ngôn ngữ nào khác.

1

Thực tế là mạngX chủ yếu được viết bằng python không có nghĩa là nó không thể mở rộng được, cũng như không hoàn thành tuyên bố. Luôn luôn có một sự cân bằng. Nếu bạn ném nhiều tiền hơn vào "máy móc" của mình, bạn sẽ có nhiều khả năng mở rộng như bạn muốn cộng với lợi ích của việc sử dụng thư viện đồ thị pythonic.

Nếu không, có các giải pháp khác, (herehere), có thể tiêu thụ ít bộ nhớ hơn (điểm chuẩn và xem, tôi nghĩ rằng igraph hoàn toàn là C sao cho nó sẽ), nhưng bạn có thể bỏ lỡ cảm giác pythonic của NX.

+0

Điều đó phần nào trả lời câu hỏi của tôi. Nhưng tôi cũng muốn biết liệu nhiều thuật toán "cốt lõi" của NetworkX có được triển khai trong C/Fortran hay không. – conradlee

+0

Tôi đã nghiên cứu một chút mã nguồn (hiện tại) và tôi không tìm thấy triển khai C/Fortran nào. Dường như mọi thứ trong đó là trăn tinh khiết ... – hymloth

+0

cảm ơn vì đã xem qua. Hãy nhớ rằng nếu numpy được gọi, sau đó (tùy thuộc vào cấu hình hệ thống) numpy có thể sử dụng LAPACK hoặc các gói đại số tuyến tính được tối ưu hóa khác. Tôi không quá quen thuộc với mức độ thường xuyên NetworkX thực sự sử dụng numpy (đó là sorta câu hỏi của tôi), nhưng tôi nhận thức được một vài ví dụ. Ví dụ, trong networkx/networkx/algorithm/centrality/eigenvector.py sử dụng numpy để tìm eigenvectors. – conradlee

14

Đây là một câu hỏi cũ, nhưng tôi cho rằng có một chức năng rất giống với NetworkX, nhưng nó được thực hiện trong C++ với mẫu (sử dụng Thư viện đồ thị tăng cường), và do đó nhanh hơn nhiều (up to two orders of magnitude)) và sử dụng ít bộ nhớ hơn nhiều.

Tuyên bố từ chối trách nhiệm: Tôi là tác giả của công cụ đồ thị.

+4

Tôi đã thử công cụ đồ thị. Nó thực sự là cách nhanh hơn nhưng loại xấu xí để sử dụng. API không cảm thấy bị sốt. –

+0

Đúng ... Chỉ muốn chia sẻ kinh nghiệm của tôi với mọi người ở đây. –

+0

@TiagoPeixoto - thư viện của bạn có phù hợp để xử lý ~ các nút 3M và ~ 10M cạnh không? Tôi đoán bộ nhớ chỉ là bộ nhớ, đúng không? – Avision

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