2015-06-12 14 views
8

Tôi có một bộ sưu tập với 100 triệu tài liệu hình học.MongoDB và sử dụng DBRef với dữ liệu không gian

Tôi có bộ sưu tập thứ hai có dữ liệu thời gian được liên kết với từng hình dạng khác. Đây sẽ là 365 * 96 * 100 triệu hoặc 3,5 nghìn tỷ tài liệu.

Thay vì lưu trữ 100 triệu mục (365 * 96) lần nhiều hơn mức cần thiết, tôi muốn giữ chúng trong các bộ sưu tập riêng biệt và thực hiện một kiểu JOIN/DBRef/Bất kỳ thứ gì tôi có thể trong MongoDB.

Đầu tiên và trước hết, tôi muốn nhận danh sách GUID từ bộ sưu tập hình học bằng cách sử dụng tính năng geoIntersection. Điều này sẽ lọc nó xuống 100 triệu đến 5000. Sau đó, sử dụng 5000 hình học đó tôi muốn lọc 3,5 nghìn tỷ tài liệu dựa trên 5000 goemetries và tiêu chí ngày bổ sung mà tôi chỉ định và tổng hợp dữ liệu và tìm mức trung bình. Bạn được để lại với 5000 hình học và 5000 trung bình cho các tiêu chí ngày bạn đã chỉ định.

Điều này về cơ bản là một JOIN như tôi biết trong SQL, điều này có thể có trong MongoDB và nó có thể được thực hiện tối ưu trong vòng chưa đầy 10 giây.

Làm rõ: như tôi hiểu, đây là những gì DBrefs được sử dụng, nhưng tôi đọc rằng nó không hiệu quả chút nào, và đối phó với nhiều dữ liệu này sẽ không phù hợp.

+1

DBRef về cơ bản không còn được dùng nữa - đó là ý tưởng tồi khi tham gia vào ứng dụng của bạn, đó là những gì bạn đang làm ở đây. Các hình học này lớn đến cỡ nào? –

+0

Các hình học là khoảng 100 byte mỗi, do đó, nó không khả thi cho họ sao chép một cách không chuẩn hóa. Cùng với bộ sưu tập hình học chạy 10GB, vì vậy mà không cần tham gia nó sẽ cần thêm 350400 GB không gian. – ParoX

Trả lời

1

Nếu bạn định xử lý dữ liệu loạt hình ảnh cùng nhau, bạn nên lưu trữ chúng trong cùng một tài liệu. Một năm giá trị của dữ liệu trong gia số 15 phút không phải là kẻ giết người - và bạn chắc chắn không muốn một tài liệu cho mọi mục nhập chuỗi thời gian! Vì bạn có thể lấy tất cả mọi thứ bạn muốn hoạt động như một tài liệu hình học duy nhất, đó là một chiến thắng lớn. Lưu ý rằng điều này cũng sẽ cho bạn những thứ thưa thớt cho dữ liệu bị thiếu. Bạn có thể mã hóa dữ liệu khác nhau nếu nó thưa thớt hơn là lập chỉ mục vào một mảng khe cắm 35040.

Một $ geoIntersects trên một đống lớn dữ liệu hình học sẽ là một vấn đề hiệu suất mặc dù. Hãy chắc chắn rằng bạn có một số chỉ mục trên (như 2dsphere) để tăng tốc độ mọi thứ.

Nếu có bất kỳ cách nào bạn có thể xây dựng vòng loại bổ sung vào truy vấn có thể loại bỏ rẻ các thành viên khỏi tìm kiếm đắt tiền hơn, bạn có thể làm cho mọi thứ trở nên khốc liệt hơn. Giống như, nói rằng tìm kiếm sẽ nhấn các tiểu bang ở Hoa Kỳ. Trước tiên, bạn có thể giao cắt tìm kiếm với các ranh giới tiểu bang để tìm các trạng thái có chứa mã địa lý và sử dụng một thứ gì đó giống như mã bưu điện để đủ điều kiện cho các tài liệu. Đó sẽ là một tìm kiếm thực sự nhanh chóng so với 50 tài liệu. Nếu ranh giới tìm kiếm được xác định lần đầu tiên đạt 2 trạng thái và các bản ghi dữ liệu địa lý bao gồm một trường trạng thái, bạn chỉ giành được 96 triệu bản ghi (tất cả mọi thứ bằng nhau) trước phần địa lý đắt tiền hơn của truy vấn. Nếu bạn giao cắt với các tọa độ lưới nhỏ, bạn có thể có khả năng thắng nó trước khi dữ liệu địa lý được xem xét.

Tất nhiên, đi quá xa sẽ thêm phí. Nếu bạn có thể điều chỉnh chính xác hệ thống với mật độ của 100 triệu hình học, bạn có thể giảm thời gian xuống khá thấp. Nhưng không thực sự làm việc với các chi tiết cụ thể của vấn đề, thật khó để biết. Dữ liệu đó có thể đòi hỏi một số thử nghiệm cụ thể hơn là dựa vào giải pháp chung.

Các vấn đề liên quan