2013-04-22 13 views
22

Tôi đang cố triển khai các thuật toán cho dữ liệu 1000 chiều với 200k + datapoints trong python. Tôi muốn sử dụng thư viện gọn gàng, scipy, sklearn, networkx và hữu ích khác. Tôi muốn thực hiện các hoạt động như khoảng cách theo cặp giữa tất cả các điểm và thực hiện phân cụm trên tất cả các điểm. Tôi đã thực hiện các thuật toán làm việc để thực hiện những gì tôi muốn với độ phức tạp hợp lý nhưng khi tôi cố gắng mở rộng chúng cho tất cả dữ liệu của tôi, tôi hết RAM. Tất nhiên tôi làm, tạo ma trận cho khoảng cách cặp đôi trên 200k + dữ liệu mất rất nhiều bộ nhớ.Làm việc với dữ liệu lớn trong python và gumpy, không đủ ram, làm thế nào để lưu một phần kết quả trên đĩa?

Ở đây có bắt: Tôi thực sự muốn làm điều này trên các máy tính không hấp dẫn với một lượng thấp của ram.

Có cách nào khả thi cho tôi để làm công việc này mà không có sự hạn chế của ram thấp. Rằng nó sẽ mất một thời gian lâu hơn thực sự không phải là một vấn đề, miễn là thời gian reqs không đi đến vô cùng!

Tôi muốn có thể đặt thuật toán của mình hoạt động và sau đó quay lại một giờ hoặc năm sau và không bị kẹt vì nó hết RAM! Tôi muốn thực hiện điều này trong python, và có thể sử dụng thư viện numpy, scipy, sklearn và networkx. Tôi muốn để có thể tính toán khoảng cách cặp với tất cả các điểm của tôi vv

Đây có phải là khả thi? Và làm thế nào tôi sẽ đi về nó, những gì tôi có thể bắt đầu đọc trên?

Trân trọng // Mesmer

+0

Câu hỏi của bạn khá mơ hồ và rất rộng. Chúng có kích thước dữ liệu khá bình thường đối với nhiều ứng dụng trong xử lý tín hiệu và học máy. Tôi khuyên bạn nên tìm hiểu về các thuật toán và kỹ thuật được sử dụng trong các trường đó. –

+3

Tôi muốn có thể thực hiện, ví dụ, khoảng cách cặp giữa tất cả các điểm trong ma trận 200.000 x 1000 trong trăn mà không có đủ ram để giữ ma trận toàn bộ khoảng cách trong bộ nhớ. Tôi đang tìm kiếm thông tin về cách để làm điều đó :) vì vậy câu trả lời cụ thể hơn sau đó một mơ hồ "nhìn vào hai lĩnh vực phụ toàn bộ khoa học máy tính" sẽ được hữu ích! – Ekgren

+6

Bạn có thể muốn xem qua [memmap] của numpy (http://docs.scipy.org/doc/numpy/reference/generated/numpy.memmap.html) và có thể là [PyTables] (http: // www. pytables.org) như là một điểm khởi đầu. –

Trả lời

31

Sử dụng numpy.memmap bạn tạo mảng trực tiếp ánh xạ vào một tập tin:

import numpy 
a = numpy.memmap('test.mymemmap', dtype='float32', mode='w+', shape=(200000,1000)) 
# here you will see a 762MB file created in your working directory  

Bạn có thể đối xử với nó như một mảng thông thường: một + = 1000.

Có thể thậm chí để chỉ định nhiều mảng đến cùng một tập tin, kiểm soát nó từ các nguồn lẫn nhau nếu cần thiết. Nhưng tôi đã trải qua một số điều phức tạp ở đây. Để mở mảng đầy đủ, bạn phải "gần" trước đó đầu tiên, sử dụng del:

del a  
b = numpy.memmap('test.mymemmap', dtype='float32', mode='r+', shape=(200000,1000)) 

Nhưng khánh chỉ có một số phần của mảng làm cho nó có thể để đạt được sự kiểm soát đồng thời:

b = numpy.memmap('test.mymemmap', dtype='float32', mode='r+', shape=(2,1000)) 
b[1,5] = 123456. 
print a[1,5] 
#123456.0 

Tuyệt quá! a đã được thay đổi cùng với b. Và những thay đổi đã được ghi trên đĩa.

Điều quan trọng khác đáng để nhận xét là offset. Giả sử bạn muốn đi không phải là 2 dòng đầu tiên trong b, nhưng dòng 150000 và 150001.

b = numpy.memmap('test.mymemmap', dtype='float32', mode='r+', shape=(2,1000), 
       offset=150000*1000*32/8) 
b[1,2] = 999999. 
print a[150001,2] 
#999999.0 

Bây giờ bạn có thể truy cập và cập nhật bất kỳ phần nào của mảng trong hoạt động đồng thời. Lưu ý kích thước byte sẽ tính toán bù trừ. Vì vậy, đối với một 'float64' ví dụ này sẽ là 150000 * 1000 * 64/8.

tài liệu tham khảo khác:

0

Bạn chỉ có thể đoạn đường nối lên bộ nhớ ảo trên hệ điều hành và sử dụng 64-bit python, cung cấp đó là một 64-bit os.

+0

Tại sao bạn nói "cung cấp nó là một hệ điều hành 64-bit"? Liệu python 32-bit không sử dụng bộ nhớ ảo? Tôi hỏi bởi vì tôi đang chạy vào các lỗi bộ nhớ mà tôi nghĩ sẽ được chữa khỏi bằng cách mở rộng tệp bộ nhớ ảo Windows7, nhưng chúng vẫn giữ nguyên. – Lobotomik

+2

Quy trình 32 bit được giới hạn ở 2Gb RAM (ảo hoặc cách khác). Điều này là do 32 bit chỉ cho phép giải quyết 4Gb và hệ điều hành dự trữ 2Gb. Có thể tinh chỉnh điều này thành 3Gb/1Gb, nhưng đó là giới hạn của bạn. Cách duy nhất khác xung quanh việc này là chia chương trình của bạn thành các quy trình riêng biệt bằng mô-đun đa xử lý, giới hạn từng mô-đun đến 2Gb. – xorsyst

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