Nếu bạn muốn giữ mức sử dụng bộ nhớ không đổi khi bạn nhận được nhiều dữ liệu hơn, thì bạn sẽ phải resample dữ liệu đó bằng cách nào đó. Điều đó ngụ ý rằng bạn phải áp dụng một số loại lược đồ rebinning. Bạn có thể đợi cho đến khi bạn nhận được một số lượng đầu vào thô nhất định trước khi bắt đầu rebinning, nhưng bạn không thể tránh nó hoàn toàn.
Câu hỏi của bạn thực sự hỏi "cách tốt nhất để tự động nhập dữ liệu của tôi" là gì? Có rất nhiều cách tiếp cận, nhưng nếu bạn muốn giảm thiểu giả định về phạm vi hoặc phân phối giá trị bạn có thể nhận được, thì phương pháp đơn giản là trung bình trên các nhóm có kích thước cố định k, với chiều rộng phân phối lôgarit. Ví dụ: giả sử bạn muốn giữ 1000 giá trị trong bộ nhớ cùng một lúc. Chọn kích thước cho k, hãy nói 100. Chọn độ phân giải tối thiểu của bạn, hãy nói 1ms. Sau đó
- Các xô đầu tiên giao dịch với giá trị giữa 0-1ms (width = 1ms)
- Thứ hai xô: 1-3ms (w = 2ms)
- Thứ ba xô: 3-7ms (w = 4ms)
- Fourth xô: 7-15ms (w = 8ms)
- ...
- Tenth xô: 511-1023ms (w = 512ms)
Đây là loạiCách tiếp cậntương tự như các hệ thống chunking được sử dụng trong hash table algorithms, được sử dụng bởi một số hệ thống tập tin và thuật toán phân bổ bộ nhớ. Nó hoạt động tốt khi dữ liệu của bạn có phạm vi động lớn.
Khi có giá trị mới, bạn có thể chọn cách bạn muốn định lại mẫu, tùy thuộc vào yêu cầu của bạn. Ví dụ: bạn có thể theo dõi một moving average, sử dụng first-in-first-out hoặc một số phương pháp tinh vi hơn khác.Xem thuật toán Kademlia cho một phương pháp (được sử dụng bởi Bittorrent).
Cuối cùng, việc rebinning phải mất một số thông tin. Lựa chọn của bạn liên quan đến việc binning sẽ xác định các chi tiết cụ thể của những thông tin bị mất. Một cách khác để nói điều này là lưu trữ bộ nhớ kích thước không đổi ngụ ý sự cân bằng giữa dynamic range và sampling fidelity; cách bạn thực hiện việc giao dịch đó tùy thuộc vào bạn, nhưng cũng giống như bất kỳ vấn đề lấy mẫu nào, không có sự kiện cơ bản nào xảy ra.
Nếu bạn thực sự quan tâm đến ưu và nhược điểm, thì không có câu trả lời nào trên diễn đàn này có thể hy vọng là đủ. Bạn nên xem xét sampling theory. Có rất nhiều nghiên cứu về chủ đề này.
Đối với những gì đáng giá, tôi nghi ngờ rằng thời gian máy chủ của bạn sẽ có phạm vi động tương đối nhỏ, vì vậy việc mở rộng thoải mái hơn để cho phép lấy mẫu giá trị phổ biến cao hơn có thể mang lại kết quả chính xác hơn.
Chỉnh sửa: Để trả lời nhận xét của bạn, đây là ví dụ về thuật toán binning đơn giản.
- Bạn lưu trữ 1000 giá trị, trong 10 thùng. Mỗi thùng chứa 100 giá trị. Giả sử mỗi bin được thực hiện như là một mảng động (một 'danh sách', trong thuật ngữ Perl hoặc Python).
Khi một giá trị mới do thỏa thuận hợp:
- Xác định bin nó phải được lưu trữ trong, căn cứ vào giới hạn bin bạn đã chọn.
- Nếu thùng chưa đầy, hãy thêm giá trị vào danh sách bin.
- Nếu thùng đầy, hãy xóa giá trị ở đầu danh sách thùng và thêm giá trị mới vào cuối danh sách bin. Điều này có nghĩa là các giá trị cũ được vứt bỏ theo thời gian.
Để tìm phần trăm thứ 90, sắp xếp thùng 10. Phần trăm thứ 90 là giá trị đầu tiên trong danh sách được sắp xếp (phần tử 900/1000).
Nếu bạn không thích vứt bỏ các giá trị cũ, bạn có thể triển khai một số phương án thay thế để sử dụng thay thế. Ví dụ, khi một thùng chứa đầy (đạt 100 giá trị, trong ví dụ của tôi), bạn có thể lấy trung bình của 50 thành phần cũ nhất (tức là 50 phần tử đầu tiên trong danh sách), loại bỏ các phần tử đó rồi thêm phần tử trung bình mới vào thùng rác, để lại cho bạn một thùng 51 yếu tố hiện có không gian chứa 49 giá trị mới. Đây là một ví dụ đơn giản về rebinning.
Ví dụ khác về rebinning là downsampling; vứt bỏ mọi giá trị thứ năm trong một danh sách được sắp xếp, ví dụ.
Tôi hy vọng ví dụ cụ thể này sẽ giúp ích. Điểm mấu chốt để lấy đi là có rất nhiều cách để đạt được một thuật toán lão hóa bộ nhớ liên tục; chỉ bạn mới có thể quyết định những gì đạt yêu cầu.
Tôi không biết. Thuật toán thay thế này dường như rõ ràng giới thiệu thiên vị đối với dữ liệu cũ. Đây là lý do tại sao tôi thực sự đánh giá cao một đối số toán học thích hợp về độ bền của bất kỳ giải pháp nào. –
Nếu dữ liệu trực tiếp được lấy từ một số phân phối D, sau đó một subsampling -any subsampling- cũng sẽ lấy được từ D. Nếu dữ liệu trực tiếp thay vì không được lấy từ một số phân phối, thì danh sách các phần trăm có thể không phải là điều làm sáng tỏ nhất tìm kiếm. – redtuna
Từ khóa hữu ích .. Tìm kiếm "số lượng" và "luồng" sẽ đưa ra tất cả các loại nghiên cứu về chủ đề này! Tất cả các kỹ thuật dường như có liên quan nhiều hơn bất kỳ thuật toán nào được đề xuất ở đây. Đó là lý do tại sao tôi do dự để đánh dấu bất cứ điều gì là "câu trả lời". –