Tôi đang cố gắng hiểu cách PyTables quản lý dữ liệu có kích thước lớn hơn kích thước bộ nhớ. Dưới đây là bình luận trong mã của PyTables (link to GitHub):PyTables xử lý dữ liệu với kích thước lớn hơn nhiều lần kích thước bộ nhớ
# Nodes referenced by a variable are kept in `_aliveNodes`.
# When they are no longer referenced, they move themselves
# to `_deadNodes`, where they are kept until they are referenced again
# or they are preempted from it by other unreferenced nodes.
Cũng bình luận hữu ích có thể được tìm thấy bên trong _getNode phương pháp. Có vẻ như PyTables có hệ thống đệm IO rất thông minh, như tôi hiểu, lưu trữ dữ liệu được người dùng tham chiếu trong bộ nhớ RAM nhanh như "aliveNodes", tiếp tục tham chiếu trước và dữ liệu không được coi là "deadNodes" để "hồi sinh" nhanh chóng khi cần và đọc dữ liệu từ đĩa nếu khóa được yêu cầu không có trong cả hai danh mục đã chết hoặc còn sống.
Tôi cần một số kiến thức chuyên môn về cách chính xác PyTables xử lý các tình huống khi làm việc với dữ liệu lớn hơn bộ nhớ có sẵn sau đó. Câu hỏi cụ thể của tôi:
- Làm thế nào deadNode/aliveHệ thống làm việc của hệ thống (ảnh chung)?
- Điểm khác biệt chính giữa các tệp aliveNodes/deadNodes trong khi cả hai biểu thị dữ liệu được lưu trữ trong RAM nếu im phải không?
- Giới hạn RAM có thể điều chỉnh theo cách thủ công không? Bên dưới nhận xét, có mã đọc giá trị từ
params['NODE_CACHE_SLOTS']
. Nó có thể được xác định bằng cách nào đó bởi người dùng? Ví dụ, nếu tôi muốn để lại một số RAM cho các ứng dụng khác mà cần bộ nhớ quá? - Trong những trường hợp nào, PyTables có thể gặp sự cố hoặc suy giảm đáng kể khi làm việc với số lượng lớn dữ liệu? Trong trường hợp của tôi có thể vượt quá bộ nhớ của 100 lần, những cạm bẫy phổ biến trong những tình huống như vậy là gì?
- Việc sử dụng PyTables có ý nghĩa gì về kích thước, cấu trúc dữ liệu và thao tác với dữ liệu được coi là 'đúng' để đạt được hiệu suất tốt nhất?
- Docs suggests sử dụng
.flush()
sau mỗi chu kỳ.append()
cơ bản. Chu kỳ này thực sự có thể kéo dài trong bao lâu? Im thực hiện một điểm chuẩn nhỏ, so sánh SQLite và PyTables trong cách họ có thể xử lý việc tạo ra một bảng lớn với các cặp khóa-giá trị từ các tệp CSV lớn. Và khi tôi sử dụng.flush()
, ít thường xuyên hơn trong chu kỳ chính, PyTables tăng tốc độ rất lớn. Vậy - liệu có đúng không, là.append()
khối dữ liệu tương đối lớn và sau đó sử dụng.flush()
?
Bạn không thể lưu trữ nội dung trong bộ nhớ 100x RAM có sẵn của bạn. Tuy nhiên, PyTables có thể giúp bạn truy cập dữ liệu theo khối hoặc áp dụng các chức năng cho dữ liệu của bạn theo cách hiệu quả về bộ nhớ (đôi khi). Bạn đang cố gắng làm gì với dữ liệu của mình? – seandavi