2009-04-21 26 views
5

Tôi đang sử dụng cơ sở dữ liệu sqlite trong nền tảng Linux nhúng arm9 của mình. Tôi muốn giảm ghi vào cơ sở dữ liệu đĩa vì đĩa của tôi là một bộ nhớ flash và nó cần chu kỳ ghi tối thiểu. Vì vậy, tôi đã cố gắng để tăng SQLITE_DEFAULT_CACHE_SIZE là 5000. Mục tiêu của tôi là ghi dữ liệu vào bộ nhớ cache và khi bộ nhớ cache được lấp đầy, tự động tuôn ra đĩa. Nhưng bằng cách incrementing SQLITE_DEFAULT_CACHE_SIZE, tôi không thể xác nhận cho dù điều này là làm việc hay không. Tôi không thấy bất kỳ thay đổi nào trong các hoạt động! Cách của tôi có đúng không? Ai có thể cho tôi một số gợi ý? Cảm ơn AneeshLàm thế nào để hạn chế cơ sở dữ liệu bung ra đĩa?

+0

Tôi không chắc chắn nếu tôi hiểu yêu cầu của bạn. Thông thường cơ sở dữ liệu được sử dụng để đảm bảo đảm bảo giao dịch. Để làm điều đó, cơ sở dữ liệu cần ghi vào đĩa. Nếu bạn có những thay đổi trạng thái không quan trọng tại sao bạn phải cập nhật cơ sở dữ liệu? Bạn chỉ có thể giữ trạng thái thay đổi trong bộ nhớ và chỉ cập nhật cơ sở dữ liệu khi bạn phải duy trì các thay đổi của mình. Trong trường hợp đó nhấn đĩa là không thể tránh khỏi bởi thiết kế, – lothar

+1

Thường không có nghĩa là luôn luôn. sqlite được sử dụng trong nhiều môi trường kỳ lạ như một cơ chế lưu trữ tạm thời. Ví dụ: lưu trữ dữ liệu từ xa trên điện thoại - nếu bộ nhớ cache biến mất, nó luôn có thể được xây dựng lại, nó chỉ chậm hơn. Trong trường hợp đó, tôi muốn nó được nhanh chóng, và tôi muốn biết nếu nó bị hỏng. Nhưng tham nhũng là OK, miễn là tôi biết rằng cửa hàng của tôi không hợp lệ. Tôi thỉnh thoảng có thể vứt nó đi. –

Trả lời

2

Mới nhất SQLite has a feature for backing up hot databases vẫn còn thử nghiệm, nhưng đề xuất của tôi là sử dụng Cơ sở dữ liệu bộ nhớ và hợp nhất với cơ sở dữ liệu trên đĩa khi bạn cho là phù hợp.

+0

Có Robert bạn là đúng, Nhưng vấn đề là tôi phải tuôn ra cơ sở dữ liệu định kỳ, mà dường như là quá nguy hiểm.My dự định là liệu Sqlite là hỗ trợ bất kỳ loại xả nước mặc định dựa trên Cache đầy đủ? Tôi đã thực hiện một số thử nghiệm dựa trên kịch bản trên bằng cách đặt PRAGMA journal_mode = MEMORY, PRAGMA SQLITE_DEFAULT_CACHE_SIZE = 5000 và PRAGMA đồng bộ = FULL, Nhưng tỷ lệ xả có vẻ tương tự như kích thước bộ nhớ cache 2000 (mặc định) và 5000.this làm tôi ngạc nhiên. –

+0

Thật không may những tùy chọn này sẽ không ảnh hưởng đến tốc độ truy cập vào ổ đĩa –

+0

Trước hết là nhờ các gợi ý hợp lý của bạn, bạn đang nói rằng, bộ nhớ cache đầy đủ không thể được sử dụng như một tiêu chuẩn để xóa dữ liệu từ Ram tệp đĩa? nếu có, thì vấn đề của tôi có thể giải quyết với bất kỳ yếu tố rủi ro nào. Bạn có tùy chọn nào khác để đề xuất không? Cảm ơn nâng cao, Aneesh –

-1

Bạn có mã nguồn để SQLite - tại sao không chỉ đơn giản là công cụ nó để ghi lại các thông tin mà bạn quan tâm đến

+0

Yeah ... thật dễ dàng! – tylerl

+0

Xin hãy giải thích, tôi không hiểu đề xuất của bạn !!!! –

+0

Mmm, câu trả lời này hoàn toàn không liên quan theo như tôi hiểu ... –

0

Ok Neil .Nếu các "SQLite đang sử dụng một hình thức ghi qua bộ nhớ đệm" sau đó vào. tràn bộ nhớ cache, nó sẽ cố gắng để tuôn ra dữ liệu vào một số tập tin tạm thời hoặc tập tin đĩa .Đây là cùng một điểm tôi đang cố gắng thử nghiệm bằng cách enalrging kích thước bộ nhớ cache và do đó có được kiểm soát trên tỷ lệ xả. Nhưng nó không xảy ra. .

+0

Thứ nhất, bạn có thể sửa đổi câu hỏi ban đầu của mình để hỏi điều này. Thứ hai, bộ nhớ đệm ghi đè có nghĩa là tất cả các ghi được ngay lập tức cam kết vào đĩa, nhưng dữ liệu được ghi cũng được giữ trong bộ nhớ cache. Do đó kích thước bộ nhớ cache có rất ít hoặc không ảnh hưởng đến tần số ghi vào đĩa. Như tôi đã nói, tôi không thể chắc chắn 100% rằng điều này đang xảy ra - hãy tự xem mã. –

2

SQLite là ACID db flushes với mọi cam kết HOẶC với mỗi lần chèn/xóa/cập nhật không được gói với giao dịch. Sử dụng giao dịch cho các hoạt động nhóm HOẶC TẮT TẮT ACID và đặt PRAGMA đồng bộ = TẮT.

"PRAGMA đồng bộ = OFF" và SQLite sẽ không dữ liệu tuôn ra ở tất cả (một cách hiệu quả để lại đó để OS Cache)

SQLITE_DEFAULT_CACHE_SIZE là ONLY cho kích thước của bộ nhớ cache. Và bộ nhớ cache chỉ được sử dụng để đọc dữ liệu.

Có một tùy chọn khác - bạn có thể triển khai lớp VFS riêng và ngăn trang tiết kiệm trước khi bộ đệm của riêng bạn sẽ đầy. Nhưng tôi chắc chắn rằng sync = off (hoặc tốt hơn để sử dụng giao dịch) sẽ thực hiện công việc đủ tốt (trong khi có cơ hội tốt để làm hỏng db của bạn trong trường hợp mất điện hoặc reset cứng để đồng bộ = off). .

Một gợi ý khác là đặt JOURNAL vào bộ nhớ hoặc tắt hoàn toàn. Một lần nữa - nó tắt axit, nhưng điều đó cũng loại bỏ một số chạm đĩa.

+0

Tôi đồng ý; cấu trúc giao dịch có lẽ là nơi có thể tìm thấy lợi ích lớn nhất. –

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