Saya memiliki file 4GB yang sangat besar dan ketika saya mencoba membacanya komputer saya hang. Jadi saya ingin membacanya sepotong demi sepotong dan setelah memproses masing-masing menyimpan potongan diproses ke file lain dan membaca bagian selanjutnya.
Apakah ada metode untuk yield
potongan-potongan ini?
Saya ingin sekali memiliki metode yang malas .
f = open('really_big_file.dat')
hanyalah pointer tanpa konsumsi memori? (Maksud saya memori yang dikonsumsi sama terlepas dari ukuran file?) Bagaimana pengaruhnya terhadap kinerja jika saya menggunakan urllib.readline () dan bukannya f.readline ()?rb
seperti yang disebutkan @Tal Weiss; dan kehilanganfile.close()
pernyataan (bisa digunakanwith open('really_big_file.dat', 'rb') as f:
untuk mencapai yang sama; Lihat di sini untuk implementasi ringkas lainnya'rb'
yang tidak hilang.'b'
data-nya akan sangat mungkin rusak . Dari docs -Python on Windows makes a distinction between text and binary files; [...] it’ll corrupt binary data like that in JPEG or EXE files. Be very careful to use binary mode when reading and writing such files.
Jika komputer Anda, OS dan python adalah 64-bit , maka Anda dapat menggunakan modul mmap untuk memetakan isi file ke dalam memori dan mengaksesnya dengan indeks dan irisan. Berikut ini contoh dari dokumentasi:
Jika komputer, OS, atau python Anda 32-bit , maka mmap-ing file besar dapat memesan sebagian besar ruang alamat Anda dan membuat program Anda kelaparan .
sumber
file.readlines()
mengambil argumen ukuran opsional yang mendekati jumlah baris yang dibaca di baris yang dikembalikan.sumber
.read()
tidak menggunakannya.readlines()
. Jika file tersebut biner, tidak akan ada jeda baris.Sudah ada banyak jawaban bagus, tetapi jika seluruh file Anda berada pada satu baris dan Anda masih ingin memproses "baris" (sebagai lawan dari blok ukuran tetap), jawaban ini tidak akan membantu Anda.
99% dari waktu, adalah mungkin untuk memproses file baris demi baris. Kemudian, seperti yang disarankan dalam jawaban ini , Anda bisa menggunakan objek file itu sendiri sebagai lazy generator:
Namun, saya pernah bertemu dengan file baris tunggal yang sangat besar (hampir), di mana pemisah baris sebenarnya tidak
'\n'
tetapi'|'
.'|'
ke'\n'
sebelum pemrosesan juga keluar dari pertanyaan, karena beberapa bidang csv ini berisi'\n'
(input pengguna teks gratis).Untuk situasi seperti ini, saya membuat cuplikan berikut:
Saya berhasil menggunakannya untuk menyelesaikan masalah saya. Ini telah diuji secara luas, dengan berbagai ukuran potongan.
Test suite, bagi mereka yang ingin meyakinkan diri mereka sendiri.
sumber
UPDATE: Pendekatan ini paling baik dijelaskan di https://stackoverflow.com/a/4566523/38592
sumber
Lihat dokumentasi resmi python, https://docs.python.org/zh-cn/3/library/functions.html?#iter
Mungkin metode ini lebih pythonic:
sumber
Saya pikir kita bisa menulis seperti ini:
sumber
saya tidak diperbolehkan berkomentar karena reputasi saya yang rendah, tetapi solusi SilentGhosts harus lebih mudah dengan file.readlines ([sizehint])
metode file python
sunting: SilentGhost benar, tetapi ini harus lebih baik daripada:
sumber
Saya dalam situasi yang agak mirip. Tidak jelas apakah Anda tahu ukuran chunk dalam byte; Saya biasanya tidak, tetapi jumlah catatan (baris) yang diperlukan diketahui:
Pembaruan : Terima kasih nosklo. Inilah yang saya maksud. Ini hampir berhasil, kecuali bahwa ia kehilangan garis 'antara' potongan.
Apakah triknya tanpa kehilangan garis, tetapi tidak terlihat bagus.
sumber
Untuk memproses baris demi baris, ini adalah solusi elegan:
Selama tidak ada garis kosong.
sumber
open
sudah memberi Anda. File sudah menjadi iterator di atas barisnya.Anda dapat menggunakan kode berikut.
open () mengembalikan objek file
lalu gunakan os.stat untuk mendapatkan ukuran
sumber