Được rồi, vì vậy câu trả lời này hơi khác với các câu trả lời khác, nhưng ... đối với tôi cảm giác như nếu bạn có dữ liệu trong hệ thống tệp (có lẽ là một tệp trên mỗi tệp) với kích thước bản ghi cố định, bạn có thể nhận được dữ liệu thực sự dễ dàng: đưa ra một truy vấn cho một kho và phạm vi thời gian cụ thể, bạn có thể tìm đến đúng nơi, tìm nạp tất cả dữ liệu bạn cần (bạn sẽ biết chính xác bao nhiêu byte), chuyển đổi dữ liệu thành định dạng bạn cần (có thể rất nhanh chóng tùy thuộc vào định dạng lưu trữ của bạn) và bạn đi vắng.
Tôi không biết gì về bộ nhớ Amazon, nhưng nếu bạn không có bất cứ thứ gì như quyền truy cập tệp trực tiếp, về cơ bản bạn có thể có các đốm màu - bạn cần cân bằng các đốm màu lớn (ít bản ghi hơn, nhưng có thể đọc nhiều dữ liệu hơn bạn cần mỗi thời gian) với các đốm màu nhỏ (nhiều bản ghi hơn cung cấp nhiều chi phí hơn và có thể nhiều yêu cầu hơn để nhận chúng, nhưng ít dữ liệu vô ích hơn được trả lại mỗi lần).
Tiếp theo, bạn thêm bộ nhớ đệm - ví dụ, tôi khuyên bạn nên cung cấp cho các máy chủ khác nhau các kho lưu trữ khác nhau để xử lý - và bạn có thể hầu như chỉ phục vụ từ bộ nhớ. Nếu bạn có đủ bộ nhớ trên đủ máy chủ, hãy bỏ qua phần "tải theo yêu cầu" và chỉ tải tất cả các tệp khi khởi động. Điều đó sẽ đơn giản hóa mọi thứ, với chi phí khởi động chậm hơn (rõ ràng là ảnh hưởng đến chuyển đổi dự phòng, trừ khi bạn có đủ khả năng để luôn có hai máy chủ cho bất kỳ cổ phiếu cụ thể nào, điều này sẽ hữu ích).
Lưu ý rằng bạn không cần phải lưu trữ ký hiệu cổ phiếu, ngày hoặc phút cho mỗi bản ghi - bởi vì chúng ẩn trong tệp bạn đang tải và vị trí trong tệp. Bạn cũng nên xem xét độ chính xác bạn cần cho mỗi giá trị và cách lưu trữ hiệu quả - bạn đã đưa ra 6SF trong câu hỏi của mình, bạn có thể lưu trữ trong 20 bit. Có thể lưu trữ ba số nguyên 20 bit trong bộ nhớ 64 bit: đọc nó dưới dạng long
(hoặc bất kỳ giá trị số nguyên 64 bit nào của bạn) và sử dụng che / dịch chuyển để đưa nó trở lại ba số nguyên. Tất nhiên, bạn sẽ cần biết quy mô để sử dụng - mà bạn có thể mã hóa trong 4 bit dự phòng, nếu bạn không thể làm cho nó không đổi.
Bạn chưa nói ba cột số nguyên khác như thế nào, nhưng nếu bạn cũng có thể sử dụng 64 bit cho ba cột đó, bạn có thể lưu trữ toàn bộ bản ghi trong 16 byte. Đó chỉ là ~ 110GB cho toàn bộ cơ sở dữ liệu, không thực sự nhiều lắm ...
CHỈNH SỬA: Điều khác cần xem xét là có lẽ cổ phiếu không thay đổi vào cuối tuần - hoặc thực sự là qua đêm. Nếu thị trường chứng khoán chỉ mở cửa 8 giờ mỗi ngày, 5 ngày mỗi tuần, thì bạn chỉ cần 40 giá trị mỗi tuần thay vì 168. Tại thời điểm đó, bạn có thể chỉ có khoảng 28GB dữ liệu trong tệp của mình ... nghe có vẻ vậy nhỏ hơn rất nhiều so với bạn có thể nghĩ ban đầu. Có nhiều dữ liệu trong bộ nhớ là rất hợp lý.
CHỈNH SỬA: Tôi nghĩ rằng tôi đã bỏ qua phần giải thích tại sao cách tiếp cận này phù hợp ở đây: bạn đã có một khía cạnh rất dễ đoán cho một phần lớn dữ liệu của mình - mã chứng khoán, ngày và giờ. Bằng cách thể hiện mã đánh dấu một lần (dưới dạng tên tệp) và để ngày / giờ hoàn toàn ẩn ở vị trí của dữ liệu, bạn đang loại bỏ toàn bộ công việc. Nó hơi giống sự khác biệt giữa a String[]
và a Map<Integer, String>
- biết rằng chỉ mục mảng của bạn luôn bắt đầu từ 0 và tăng lên theo gia số 1 cho đến chiều dài của mảng cho phép truy cập nhanh và lưu trữ hiệu quả hơn.