Pertanyaan Matriks yang sangat besar menggunakan Python dan NumPy


NumPy adalah pustaka yang sangat berguna, dan dari menggunakannya saya telah menemukan bahwa ia mampu menangani matriks yang cukup besar (10000 x 10000) dengan mudah, tetapi mulai berjuang dengan apa pun yang jauh lebih besar (mencoba membuat matriks 50000 x 50000 gagal ). Tentunya, ini karena persyaratan memori yang sangat besar.

Apakah ada cara untuk membuat matriks besar secara asli di NumPy (katakanlah 1 juta dengan 1 juta) dalam beberapa cara (tanpa memiliki beberapa terrabytes RAM)?


75
2018-06-28 00:32


asal


Jawaban:


PyTable dan NumPy adalah cara untuk pergi.

PyTables akan menyimpan data pada disk dalam format HDF, dengan kompresi opsional. Kumpulan data saya sering mendapatkan kompresi 10x, yang berguna saat menangani puluhan atau ratusan juta baris. Ini juga sangat cepat; laptop saya yang berumur 5 tahun dapat mengalami krisis melalui data yang melakukan SQL-like GROUP BY agregasi pada 1.000.000 baris / detik. Tidak buruk untuk solusi berbasis Python!

Mengakses data sebagai rekam ulang NumPy lagi sesederhana:

data = table[row_from:row_to]

Perpustakaan HDF menangani pembacaan di bagian data yang relevan dan mengkonversi ke NumPy.


84
2018-06-30 09:11



numpy.arrays dimaksudkan untuk hidup dalam memori. Jika Anda ingin bekerja dengan matriks yang lebih besar dari RAM Anda, Anda harus menyelesaikannya. Setidaknya ada dua pendekatan yang bisa Anda ikuti:

  1. Coba representasi matriks yang lebih efisien yang mengeksploitasi struktur khusus apa pun yang dimiliki matrik Anda. Sebagai contoh, seperti yang telah ditunjukkan oleh orang lain, ada struktur data yang efisien untuk matriks jarang (matriks dengan banyak nol), seperti scipy.sparse.csc_matrix.
  2. Ubah algoritma Anda untuk bekerja pada submatrices. Anda dapat membaca dari disk hanya blok-blok matriks yang saat ini digunakan dalam perhitungan. Algoritma yang dirancang untuk dijalankan pada kluster biasanya bekerja secara memblok, karena data di-scatted di komputer yang berbeda, dan dilewatkan hanya jika diperlukan. Sebagai contoh, algoritma Fox untuk perkalian matriks (file PDF).

53
2018-06-28 02:53



Anda harus dapat menggunakan numpy.memmap ke peta memori file pada disk. Dengan mesin python dan 64-bit yang lebih baru, Anda harus memiliki ruang alamat yang diperlukan, tanpa memuat semuanya ke dalam memori. OS harus menangani hanya menyimpan sebagian file dalam memori.


29
2018-06-28 01:46



Untuk menangani matriks jarang, Anda membutuhkan scipy paket yang berada di atas numpy -- Lihat sini untuk detail lebih lanjut tentang opsi sparse-matrix itu scipy Memberi anda.


24
2018-06-28 02:23



Stefano Borini pos membuat saya melihat seberapa jauh hal semacam ini sudah ada.

Ini dia.  Tampaknya pada dasarnya apa yang Anda inginkan. HDF5 akan membiarkan Anda menyimpan dataset yang sangat besar, lalu mengakses dan menggunakannya dengan cara yang sama seperti NumPy.


11
2018-06-28 02:54



Pastikan Anda menggunakan sistem operasi 64-bit dan versi 64-bit Python / NumPy. Perhatikan bahwa pada arsitektur 32-bit Anda dapat mengatasi memori 3GB khas (dengan sekitar 1GB hilang ke memori yang dipetakan I / O dan semacamnya).

Dengan ukuran 64-bit dan hal-hal yang lebih besar daripada RAM yang tersedia, Anda dapat menggunakan memori virtual, meskipun hal-hal akan menjadi lebih lambat jika Anda harus bertukar. Selain itu, peta memori (lihat numpy.memmap) adalah cara untuk bekerja dengan file-file besar pada disk tanpa memuatnya ke dalam memori, tetapi sekali lagi, Anda harus memiliki ruang alamat 64-bit agar bisa digunakan. PyTables akan melakukan sebagian besar untuk Anda juga.


5
2017-08-19 00:27



Ini sedikit alpha, tapi http://blaze.pydata.org/ tampaknya sedang berusaha memecahkan ini.


5
2018-02-05 00:58