Cách thực tế để lưu trữ một lượng dữ liệu lớn hợp lý mà hầu như không bao giờ thay đổi?


13

Hãy suy nghĩ về các bảng tra cứu được tính toán trước hoặc một cái gì đó. Tại thời điểm nào có ý nghĩa hơn để sử dụng cơ sở dữ liệu thay vì giá trị mã hóa cứng trong ứng dụng của tôi? Các giá trị sẽ không thay đổi và chúng được tách biệt khỏi các nhà phát triển bảo trì. 100 giá trị, 1k, 10k, 100k? Tôi muốn lưu trữ khoảng 40k giá trị. Ngay bây giờ, đó là một switchtuyên bố do máy tạo ra (điều mà VS2010 không hài lòng).

biên tập:

Nếu có ai tò mò, đây là cách tôi tiếp cận điều này: Dữ liệu của tôi được lưu trữ trong hai mảng float 100k phần tử, vì vậy đó là những gì tôi đã làm. Mất khoảng 20 giây để tạo dữ liệu, vì vậy tôi đã làm điều đó một lần và tuần tự hóa nó thành tài nguyên được nhúng bằng BinaryFormatter. Việc giải nén dữ liệu mất khoảng 5 mili giây khi khởi động ứng dụng và vượt trội so với triển khai cơ sở dữ liệu mà tôi đã thay thế (các giá trị được mã hóa cứng này đã được lưu trữ ở đó trước đó) gần 45.000 lần.

Câu trả lời:


5

Đề nghị của tôi là giữ dữ liệu trong một tệp hoặc bảng cơ sở dữ liệu. Nếu tốc độ không phải là vấn đề, thì truy vấn tệp hoặc cơ sở dữ liệu (cơ sở dữ liệu tốt hơn) trong thời gian chạy. Nếu bộ nhớ không phải là vấn đề, nhưng bạn muốn có một số tốc độ, sau đó tải dữ liệu vào bộ nhớ khi chương trình bắt đầu. Trong C #, bạn có thể sử dụng và sắp xếp mảng, liệt kê hoặc (tùy chọn tốt nhất) bảng băm và có phương thức trả về dữ liệu bạn cần trong thời gian chạy (ví dụ: getDataValue (chuỗi keyToValue)).

Tôi khuyên bạn không nên sử dụng câu lệnh chuyển đổi vì nó sẽ rất khó duy trì và sẽ dẫn đến một dấu chân lớn.

Bảng băm, ví dụ: http://support.microsoft.com/kb/309357


Đây cuối cùng là những gì tôi đã làm: kiểm tra bài viết cập nhật của tôi.
Bryan Boettcher

1
+1 cho đề xuất cơ sở dữ liệu. Cơ sở dữ liệu được tạo để lưu trữ khối lượng dữ liệu lớn và cho phép bạn tìm nạp chúng rất nhanh.
NoChance

Xem stackoverflow.com/questions/301371/ trên để biết lý do tại sao nên sử dụng từ điển cho việc này tốt hơn là hashtable. YMMV
Chris McKee

6

Cá nhân, tôi ổn để lưu trữ bất kỳ lượng dữ liệu nào, được mã hóa cứng vào ứng dụng, cho đến khi không cần phải điều chỉnh nó cho một triển khai hoặc hotfix cụ thể.

Tuy nhiên, lưu trữ và truy cập dữ liệu bằng cách sử dụng câu lệnh chuyển đổi C #, là một thực tế khá tệ, vì trong mô hình truy cập dữ liệu và lưu trữ dữ liệu kết hợp chặt chẽ và chỉ ngụ ý một phương thức truy cập phương thức (theo tham số chuyển đổi).

Tôi muốn lưu trữ dữ liệu trong Hashtable hoặc Từ điển và cung cấp các lớp riêng biệt để truy xuất dữ liệu và một lần sử dụng từ điển tra cứu.

Gần đây, tôi thấy khá thuận tiện khi triển khai DSL nhỏ để chỉ định quy tắc kinh doanh ( giao diện lưu loát cho SiteMap hoặc phương pháp kiểm tra câu hỏi phỏng vấn máy tính thuế để kiểm tra quy tắc) và sau đó cung cấp đối tượng riêng để truy vấn các quy tắc này. Kỹ thuật này sẽ áp dụng tốt cho kịch bản trường hợp chuyển đổi.

Một trong những lợi ích tuyệt vời của việc phân tách như vậy là bạn có thể triển khai một số Lượt xem trên dữ liệu của mình mà không cần chạm vào các dòng XXXk blob, xác định dữ liệu đó.


Tôi đã mở rộng câu trả lời với một số ví dụ.
Valera Kolupaev

2

Một tuyên bố chuyển đổi dòng 40k là một câu hỏi nhỏ. Tôi giả sử bạn vẫn cần phải thực hiện các hoạt động truy vấn phải không? Bạn đã thử đóng gói dữ liệu? Sau đó sử dụng LINQ để thực hiện các thao tác truy vấn trên bộ sưu tập để kiểm tra hiệu năng. Nhận được một số lần cụ thể bằng cách chạy kiểm tra đơn vị với một bộ đếm thời gian như StopWatch . Sau đó, nếu bạn nghĩ rằng nó có thể chỉ hoạt động. Xem nếu hiệu suất được chấp nhận cho người dùng.


2

Tôi đã có một yêu cầu như thế này hai lần. Các ứng dụng được thiết kế độc lập mà không cần thiết lập / truy cập cơ sở dữ liệu. Trong cả hai trường hợp, tôi đã sử dụng các tệp XML để lưu trữ dữ liệu. Trong lần đầu tiên, trên Khung 2.0, tôi đã sử dụng các cuộc gọi phân tích cú pháp XML kiểu cũ để tra cứu dữ liệu. Đối với phiên bản mới hơn, trên Khung 3.5, tôi đã sử dụng LINQ to XML để tìm thứ tôi cần. Trong cả hai trường hợp, quyền truy cập vào dữ liệu được gói gọn trong các lớp.


1

Điều quan trọng ở đây là đảm bảo giao diện công cộng của bạn gói gọn việc triển khai của bạn - nhưng đó không phải là câu hỏi của bạn và không có lý do gì để nghĩ rằng bạn không có. Ngoài ra, đó chỉ là một câu hỏi về hiệu suất so với đau buồn (và sự khác biệt về hiệu suất có thể không đáng quan tâm). Như một giải pháp thực tế, đối với vấn đề VS 2010, bạn luôn có thể chia câu lệnh tình huống thành một hệ thống phân cấp các câu lệnh tình huống - cấp cao nhất có thể gọi một trong 10 phương thức khác, mỗi phương thức có câu lệnh tình huống là 4000 trường hợp. Bạn có thể đặt từng cái trong số 10 vào tập tin riêng của nó nếu bạn phải. Một chút xấu xí, nhưng dù sao bạn cũng đang tạo mã.

Đối với số để chuyển sang DB - đó là bất cứ khi nào không sử dụng DB trở thành một vấn đề.


Tôi đánh giá cao suy nghĩ rằng giao diện của tôi gói gọn việc thực hiện: nó chắc chắn là có. Các chức năng được thể hiện thông qua một GetValuesForInputphương pháp -type và tuyên bố lớn của tôi bị ẩn trong việc thực hiện.
Bryan Boettcher

1

Bạn có thể sử dụng một cái gì đó như SQL Compact. Đặt dữ liệu vào một bảng và để lại tệp DB trong dự án. Các bảng phù hợp hơn với lượng dữ liệu đó hơn là một câu lệnh chuyển đổi.


1

Tôi nghĩ từ khóa ở đây là 'khó'

Nếu dữ liệu không bao giờ thay đổi - ví dụ: các giá trị toán học được tính toán trước, hằng số màu và tương tự - thì chắc chắn, miễn là kích thước có thể quản lý được cho bạn, hãy giữ nó trong mã. Chỉ cần lưu ý rằng nếu hiệu suất là một vấn đề, các câu lệnh case / switch sẽ rất chậm so với các tùy chọn khác.

Nếu dữ liệu hầu như không bao giờ thay đổi - ví dụ: mã vùng điện thoại, ranh giới quốc gia và tương tự - có lẽ tôi sẽ xem xét việc giữ dữ liệu bên ngoài theo một cách nào đó. Đặc biệt nếu nó bắt đầu nhận được nhiều hơn một vài chục giá trị.


1
Nó phụ thuộc vào trình biên dịch tốt như thế nào. Một tuyên bố trường hợp trong Delphi có thể cực kỳ hiệu quả.
Loren Pechtel

1

Nếu bạn lưu trữ khối lượng lớn dữ liệu vào ứng dụng của mình, thì chương trình của bạn có thể tải chậm hơn và bạn có thể gặp rủi ro trong trường hợp ai đó có thể chơi với nhị phân hoặc thực thi.

Ngoài ra, nếu chương trình được chỉnh sửa nhiều lần, ai biết được, có thể bạn có thể đưa ra lỗi bằng cách nhập sai số hoặc do kết quả của lệnh thay đổi.

Có thể trong tương lai một số người yêu cầu chạy các truy vấn trên dữ liệu, giả sử, ai đó có thể yêu cầu mức trung bình của một cột, trong trường hợp đó bạn sẽ phải thay đổi ứng dụng của mình và thêm phương thức để tính toán mọi truy vấn mà người dùng của bạn đưa ra với, sau đó thực hiện tất cả các bước để quảng bá mã của bạn đến sản xuất. Điều này thực sự không tốt.

Tách dữ liệu và mã là một thực hành tốt đặc biệt nếu dữ liệu lớn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.