SQLite có phải là một lựa chọn hợp lý để ghi dữ liệu không?


8

Tôi đang cố gắng thiết lập một ứng dụng ghi dữ liệu nhỏ trong linux. Dữ liệu đến qua cổng nối tiếp và từ đó nên được bơm để ghi nhật ký và hiển thị đồ họa.

Chức năng ghi nhật ký là có cho mục đích khởi tạo của chức năng vẽ đồ thị, sau khi khởi động lại.

Dữ liệu đến mỗi giây và bao gồm 1 số có độ chính xác 5 chữ số thập phân và phải được ghi lại trong 2 năm. Dung lượng trống hiện tại của tôi là khoảng 15 GB.

Các ngôn ngữ của dự án cho đến nay là bash và python.

Mục tiêu của tôi là làm cho hệ thống ghi nhật ký đơn giản nhưng mạnh mẽ (có thể là một số bản sao lưu trực tiếp vào ổ đĩa flash?), Nó cũng nhanh và dễ đọc từ python và viết từ bash.

SQLite có phù hợp với điều này không (tôi chưa bao giờ sử dụng nó)? Là một tập tin văn bản trong thư mục nhà của tôi phù hợp cho việc này?


7
Trong thế giới phần mềm không có "tốt nhất"; chỉ có sự đánh đổi
m3th0dman

@Thijs van Điền, nhận xét này phải là một câu trả lời - nó xứng đáng với mức tối thiểu cho sự đơn giản của nó, nếu không phải là câu trả lời được chấp nhận!
Vorac

Như bạn ước. :)
Thijs van Điền

Câu trả lời:


6

Cả hai lựa chọn có vẻ hợp lệ với tôi. Trong những trường hợp như vậy, một quy tắc hữu ích để áp dụng là thực hiện điều đơn giản nhất có thể làm việc . Các tệp văn bản dễ dàng hơn để bắt đầu và dự kiến ​​sẽ hoạt động hợp lý tốt ít nhất là vào lúc đầu. Một khi các yêu cầu phát sinh được thỏa mãn tốt hơn khi sử dụng cơ sở dữ liệu, việc nhập chúng sẽ không quan trọng. Sử dụng chiến lược này, bạn hoãn các quyết định thiết kế càng lâu càng tốt (nhưng không lâu hơn thế). Như vậy, bạn không làm những việc không cần thiết. Khi, nếu có, nó sẽ là cần thiết, bạn sẽ hiểu rõ hơn nhiều về chính xác những gì bạn cần. Do đó, bạn có nhiều khả năng xây dựng Điều đúng và không lãng phí thời gian để xây dựng Điều sai.


Lời khuyên rất tốt. Nói từ kinh nghiệm tôi đoán. Sắp xếp nhà cũng vậy.
TheRealChx101

11

Tôi sẽ nói rằng đưa ra các yêu cầu cho sự mạnh mẽ và tuổi thọ rằng một tệp văn bản cũ đơn giản là một lựa chọn tốt hơn. Như những người khác đã lưu ý, tốc độ dữ liệu của bạn không cao; Ngoài ra, xử lý hậu kỳ của bạn là tất cả ngoại tuyến từ hệ thống ghi nhật ký, do đó bạn không cần phải ghi dữ liệu của mình theo cách hiệu quả nhất vì bạn có thể đọc lại lúc rảnh rỗi.

Một hệ thống tệp là một cơ sở dữ liệu (mặc dù là một hệ thống suy biến) và việc thêm vào các tệp văn bản rất nhẹ về tài nguyên hệ thống. Thật khó để đánh bại

echo data >> mylogfile

cho hoạt động gọi hệ thống tối thiểu. Ngoài ra các tệp văn bản mạnh mẽ hơn nhiều khi đối mặt với tham nhũng nội bộ so với db sqlite và đặc biệt là tệp dưa chua.

Tôi đoán rằng ứng dụng của bạn là một cảm biến từ xa, không giám sát, ở một nơi không dễ để có được một nhà điều hành. Trong trường hợp đó, giải pháp công nghệ thấp nhất nên được ưu tiên.


Một điều tuyệt vời khác khi sử dụng một tệp văn bản đơn giản là, nếu bạn chia nó theo ngày, bạn có thể sử dụng cùng một kỹ thuật để nén các tệp cũ bằng một croncông việc, tiết kiệm dung lượng đĩa. Như thế này
Peter K.

Yup, tệp văn bản với một dòng mỗi giây. Đơn giản, bền và có thể mở rộng (nếu / khi tôi thêm nhiều cảm biến / số lượng, chúng sẽ chỉ được gắn trên cùng một dòng). Đây là một cuộc thảo luận tổng quát hơn về hệ thống của tôi và đây là mã nguồn đang hoạt động. Tôi sẽ đăng câu trả lời với ảnh chụp màn hình trong câu trả lời khác đó, khi hoạt động.
Vorac

Điều quan trọng, một tệp văn bản có thể được gắn cờ cho chế độ chỉ chắp thêm bằng cách sử dụng chattr + để bảo vệ hiệu quả nội dung khỏi ghi đè. Điều đó không thể được thực hiện với sqlite.
Federico

3

Như @gbjbaanb đã chỉ ra, SQLite "không được thiết kế để chèn rất nhiều bản ghi ở tốc độ cao."

Tôi muốn nói 1 số / 1 giây không phải là cao tốc độ nếu bạn giữ kết nối đến cơ sở dữ liệu mở. Và điều đó sẽ hoạt động hợp lý tốt, nhưng nhật ký thường được thực hiện trên các tập tin, giải pháp đó là thông thường hơn và có thể thanh lịch do đó.

Tôi sẽ sử dụng các tệp văn bản và tôi sẽ tạo một tệp mới mỗi tháng. Bạn có thể nén và / hoặc xóa các tệp cũ sau một thời gian có thể phù hợp với bạn nếu dung lượng ổ cứng gặp sự cố.

Nếu "Chức năng ghi nhật ký có sẵn cho mục đích khởi tạo chức năng vẽ đồ thị, sau khi khởi động lại." bạn chỉ cần một cửa sổ thời gian với n phần tử cuối cùng sau đó bạn có thể thêm một finallykhối vào mã của mình và sử dụng picklecho dumpmột số cấu trúc dữ liệu và loadchúng sau khi khởi động lại. Nhưng hãy chắc chắn rằng trước khi khởi động lại thực sự cho phép bạn làm những gì bạn cần.

Đó có lẽ là giải pháp đòi hỏi ít tài nguyên hơn và phù hợp hơn với yêu cầu của bạn.


Tôi đã xem xét câu trả lời của bạn rất sâu sắc. Tuy nhiên, tôi đi đến kết luận rằng việc tạo một tệp mới mỗi tháng sẽ bổ sung logic đáng kể cho dự án. Do đó, tôi đã quyết định sử dụng một tập tin hudge. Nó sẽ được lưu trữ mỗi tháng một lần, tuy nhiên, tôi cho bạn +1.
Vorac

2

Không. SQLite là một công cụ tuyệt vời, nhưng nó không được thiết kế để chèn rất nhiều bản ghi ở tốc độ cao.

Giải pháp tốt nhất ở đây là một cái gì đó có thể được thêm vào một cách nhanh chóng, và đó là một tệp. Một tệp như vậy có thể được đặt ở bất cứ đâu bạn thích, trên Linux, chúng thường được đặt trong / var / log (vì một số quản trị viên thích đặt / var trên một phân vùng riêng vì vậy nếu một ứng dụng giả mạo ghi nhiều dữ liệu, nó sẽ không bị sập HĐH khi nó lấp đầy đĩa).

Sau khi dữ liệu được ghi, bạn có thể viết một công cụ đọc các tệp nhật ký, nhập chúng vào SQLite DB và sử dụng dữ liệu đó để báo cáo.

Ngoài ra, sử dụng một công cụ hiện có như Nagios . Viết một plugin cho nó (nếu bạn không thể cấu hình nó để nhận ra dữ liệu của bạn trực tiếp trong tệp nhật ký) và sử dụng plugin đó để theo dõi và báo cáo.


Bạn sẽ nói rằng một bản ghi mỗi giây là "tốc độ cao"?
thorsten müller

không, thực sự không, nhưng SQLite vẫn không phải là công cụ cho việc này. Chèn vào giữa một bảng với 63 triệu bản ghi sẽ không phải là siêu nhanh. Một tập tin văn bản vẫn là một lựa chọn hiệu quả hơn.
gbjbaanb

0

Đúng. SQLite chỉ là một tệp nhị phân. Bạn chỉ cần có một bộ xương trống cho cơ sở dữ liệu của mình một lần, sau đó bạn có thể chỉ cần nối thêm dữ liệu vào tệp nhị phân đó để điền vào "cơ sở dữ liệu".

Trong một công ty cũ, chúng tôi đã thực hiện điều này cho hệ điều hành Symbian (Sử dụng ngôn ngữ c ++), thực hiện một số loại đăng nhập. Thật không may, đây là một thời gian trước đây và tôi không thể nhớ các chi tiết.

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.