Nếu bạn đang tìm cách không thực sự tải tệp, hãy thực hiện điều này với json
không thực sự là phương pháp phù hợp. Bạn có thể sử dụng một tệp ánh xạ bộ nhớ ... và không bao giờ thực sự tải tệp vào bộ nhớ - mảng memmap
có thể mở tệp và tạo một mảng "trên đĩa" mà không tải bất kỳ thứ gì vào bộ nhớ.
Tạo một mảng bộ nhớ ánh xạ của dicts:
>>> import numpy as np
>>> a = np.memmap('mydict.dat', dtype=object, mode='w+', shape=(4,))
>>> a[0] = {'name':"Joe", 'data':[1,2,3,4]}
>>> a[1] = {'name':"Guido", 'data':[1,3,3,5]}
>>> a[2] = {'name':"Fernando", 'data':[4,2,6,9]}
>>> a[3] = {'name':"Jill", 'data':[9,1,9,0]}
>>> a.flush()
>>> del a
Bây giờ đọc mảng, mà không cần tải file:
>>> a = np.memmap('mydict.dat', dtype=object, mode='r')
Nội dung của tập tin được nạp vào bộ nhớ khi danh sách là được tạo nhưng không cần thiết - bạn có thể làm việc với mảng trên đĩa mà không cần tải nó.
>>> a.tolist()
[{'data': [1, 2, 3, 4], 'name': 'Joe'}, {'data': [1, 3, 3, 5], 'name': 'Guido'}, {'data': [4, 2, 6, 9], 'name': 'Fernando'}, {'data': [9, 1, 9, 0], 'name': 'Jill'}]
Phải mất một lượng đáng kể thời gian (ví dụ nano giây) để tạo ra một mảng bộ nhớ ánh xạ mà có thể chỉ mục một tập tin bất kể kích thước (ví dụ 100 GB) của tập tin.
Ý bạn là gì khi "không tải"? – user2357112
Vâng, một cách là tải tệp vào bộ nhớ, thêm danh sách mới vào đó và kết xuất kết quả lại vào đĩa. Có thể chỉ cần ghi danh sách mới vào đĩa, gắn nó vào cuối tập tin mà không cần tải tập tin vào bộ nhớ không? – jazzblue
Điều này có thể được sử dụng: http://stackoverflow.com/questions/12460943/merging-pre-sorted-files-without-reading-everything-into-memory Tải dict mới vào một tệp mới, sau đó hợp nhất hai tập tin có lẽ? –