Tôi đã có một dự án nơi các cảm biến vật lý gửi dữ liệu đến máy chủ. Dữ liệu được gửi bất thường - sau khi một cái gì đó kích hoạt một cảm biến, nhưng không ít thường xuyên hơn mỗi 20 phút. Trên dữ liệu máy chủ được lưu trữ trong cơ sở dữ liệu Posgresql.Phân tích dữ liệu dựa trên thời gian với Python
cấu trúc dữ liệu trông giống như:
Sensor Table
sensor name - string
sensor serial no - string
sensor type - foreign key to types table
Sensor Data Table
sensor - foreign key
timestamp
value 1 - boolean
value 2 - boolean
value 3 - integer
value 4 - float
...
Nó dự kiến sẽ không quá tổng số 100 yêu cầu/giây. Hồ sơ dữ liệu trong cơ sở dữ liệu nên được lưu giữ trong 90 ngày và thậm chí nhiều hơn trong một số trường hợp (không chỉ 2 tuần như tôi đã nghĩ trước đó). Vì vậy, tổng số lượng hồ sơ sẽ không quá 120 960 000/14 ngày. Đây là ước lượng "an toàn". Trong thực tế nó có thể là 10 lần ít hơn (10 req/giây, 12 960 000 hồ sơ).
tôi cần phải làm một số phân tích về dữ liệu, như:
- Do something khi một kỷ lục mới đến và đó là "giá trị 2" là đúng
- Do something khi "giá trị 2" cảm biến X là đúng hơn thời gian khai báo lâu hơn (50 phút, 1 giờ hoặc nhiều lần khác)
- Làm điều gì đó khi tổng thời gian thực của X cho "giá trị 2" trong 24 giờ là nhiều hơn thời gian đã khai báo
- Làm điều gì đó khi cảm biến "Giá trị 3" của X là đúng lâu hơn một số thời gian đã khai báo và không có cảm biến nào khác của loại XYZ đã hoạt động trong khoảng thời gian này ...
"Thời gian đã khai báo" ở trên lớn hơn hoặc bằng 1 giây.
Toàn bộ phần máy chủ được phát triển ở Django (và django-rest-framework để thu thập dữ liệu).
Các câu hỏi là làm thế nào để phân tích dữ liệu hiệu quả, giả sử rằng phải có thời gian thực hoặc gần với thời gian thực (1 giây) theo dõi dữ liệu và khoảng thời gian để kích hoạt hành động mong muốn.
những suy nghĩ của tôi:
Chạy quá trình đó sẽ truy vấn cơ sở dữ liệu mỗi giây cho các hồ sơ đáp ứng tiêu chí và gọi hành động cụ thể (nó có lẽ sẽ phải mất hơn 1 giây)
Run số riêng quy trình (eventlet?) một cho mỗi loại phân tích và sau đó truy vấn cơ sở dữ liệu sau mỗi 1 giây và kích hoạt các hành động cụ thể.
Chạy một quy trình cho mỗi bộ cảm biến liên tục báo cáo cho người đăng ký: Tôi là đúng trên "giá trị 2" dài hơn x giây, vv .. Quá trình được đặt lại sau khi dữ liệu mới cho cảm biến đó đến. Một số giải pháp đăng ký xuất bản như zeromq có thể được sử dụng ở đây?
Sử dụng một số khác/giải pháp nhanh hơn
- MongoDB - vấn đề có thể là file của MongoDB mà không phải là đầm sau khi số liệu được lấy ra (2 tuần).
- Hadoop - không quá lớn và quá phức tạp đối với loại sự cố này?
- Pandas và một số lưu trữ HDF5 - vấn đề có thể là liệu nó có khả năng thực hiện phân tích mà tôi đã mô tả ở trên và có lẽ cũng có thể ghi vào tệp. Nhưng .. có thể làm việc với mongo quá.
Gợi ý?
Cập nhật.
Hiện nay các giải pháp mà có vẻ là đơn giản và hiệu quả với tôi là:
- sau khi dữ liệu đến trên cảm biến Một chạy tất cả các xét nghiệm và
- kết quả cửa hàng thử nghiệm ở một số "bài kiểm tra" bảng (hoặc redis) trong một cách mà nói: "còn cảm biến mở hơn"
- today at 1:15 chạy action
- today at 1:30 chạy action "cảm biến mở lâu hơn trong giai đoạn 24h" ...
- liên tục quét bảng "kiểm tra" ở trên và khi ngày hôm nay 1:15 chiều, sau đó chạy hành động mong muốn, v.v.
- khi tín hiệu mới đến cảm biến A sau đó chạy lại tất cả thử nghiệm và cũng đặt lại dữ liệu "kiểm tra" bảng.
Điều này đòi hỏi tôi phải thử nghiệm mỗi khi có yêu cầu đến một cảm biến cụ thể, nhưng ở phía bên kia tôi sẽ chỉ quét bảng "kiểm tra", cứ sau 1 giây.
Cập nhật PyTables 2
tôi đã phát hiện ra (http://www.pytables.org/moin/PyTables), trông nó khá thích hợp cho trường hợp sử dụng của tôi như là một lưu trữ dữ liệu.
Cảm ơn, đây là những giải pháp thực sự có giá trị. Tôi sẽ đi với sql đầu tiên và xem nó nhanh như thế nào. – eXt
Quá nhanh với nhận xét trước, vì vậy: Tôi sẽ đi với sql đầu tiên và xem nhanh như thế nào. Các bảng trong bộ nhớ sẽ nhanh nhưng tôi phải lưu giữ dữ liệu. Redis ... thú vị nhưng tôi không chắc liệu nó có phù hợp với: 1. lưu trữ quá nhiều dữ liệu ở đó (nó phải được duy trì) 2. lọc dữ liệu này, ví dụ tôi phải tính tổng thời gian của bất hoạt trong 24 giờ (tôi cũng thực hiện một số phân tích khác về dữ liệu thu thập được, nhưng điều này không xảy ra thường xuyên) Mongo. Sẽ 100 req/giây là enought gây ra viết khóa? Tôi có lẽ sẽ phải kiểm tra nhanh như thế nào mongo và so sánh nó với kết quả từ sql db. – eXt
Siêu! Vui mừng bạn đánh giá cao nó. Redis, không giống như Memcache, lưu trữ dữ liệu liên tục. Nó lưu trữ nhiều như nó có thể trong RAM và các trang vào/ra khi cần. Cho rằng, có vẻ như với tôi yêu cầu của bạn là phù hợp hơn cho SQL. Re: Mongo. # của Reqs. không có gì để làm với ổ khóa. Mongo rất tuyệt vời ở chế độ chỉ đọc, chỉ ghi tốt, không tốt với đọc-ghi vì viết khóa chặn toàn bộ cơ sở dữ liệu (không có lần đọc/ghi nào khác có thể xảy ra) vì vậy viết quá nhiều sẽ khiến bạn mất thời gian chờ. Nếu dữ liệu của bạn + chỉ mục phù hợp với RAM, nó sẽ dễ chịu. Như bạn đã nói, bạn sẽ chỉ biết nếu bạn cố gắng. – Adil