2009-12-18 35 views
5

Tôi có một lượng lớn dữ liệu được lưu trữ trong một tệp XML, 173 MB (4,6 triệu dòng), mà tôi đã lưu trữ trong thư mục làm việc của ứng dụng Windows Forms. Đó là kết quả của việc viết một datatable cho một tập tin XML. Các datatable là originaly dân cư từ một truy vấn đến một máy chủ SQL.Tìm kiếm ý tưởng về lưu trữ dữ liệu trên đĩa cục bộ

Lý do tôi lưu trữ cục bộ thay vì yêu cầu từ máy chủ là yêu cầu dữ liệu mất tối đa 40 giây và thời gian hết giờ và dữ liệu tĩnh và sẽ không bao giờ thay đổi, hơn nữa người dùng có thể ngoại tuyến và vẫn sử dụng dữ liệu.

Tải tệp trở lại vào bảng dữ liệu mất 20-30 giây. Tôi không quá lo lắng về thời gian cần tải từ đĩa vì tôi cho người dùng biết rằng dữ liệu đang tải và kiên nhẫn. Tuy nhiên tôi không thích định dạng tệp XML và tôi đang tìm các ý tưởng khác để lưu trữ đĩa.

Bảng dữ liệu chỉ được sử dụng làm người trung gian cho số lượng cuối cùng của đối tượng thu thập. Nếu bạn có sugestions tôi muốn nghe họ.

Tôi hy vọng sẽ tránh xa một giải pháp cơ sở dữ liệu và dựa vào phương pháp tiếp cận tệp nhị phân. Dưới đây là nỗ lực đầu tiên của tôi, nhưng tôi nhận được một ra khỏi memory exception:

byte[] b = null; 

using (MemoryStream stream = new MemoryStream()) 
{ 
    BinaryFormatter bformatter = new BinaryFormatter(); 
    bformatter.Serialize(stream, timeData); 
    b = stream.ToArray(); 
} 

using (FileStream fileStream = new 
    FileStream("brad.bin", FileMode.Create, FileAccess.Write)) 
{ 
    fileStream.Write(b, 0, b.Length); 
} 
+0

Ông có thể nói lý do tại sao bạn đang "hy vọng sẽ tránh xa một giải pháp cơ sở dữ liệu"? Như nhiều người trả lời đã chỉ ra, điều này có vẻ phù hợp với cơ sở dữ liệu cục bộ nhẹ: nếu bạn giải thích ràng buộc thiết kế mà bạn cảm thấy làm sai, có thể mọi người có thể đề xuất các lựa chọn thay thế. – itowlson

+0

Tôi chỉ hy vọng tránh nó. nó chỉ dường như ba rất nhiều công việc để đi đến với rất ít benifit – Brad

+0

Nó rất ít công việc thêm. SQLite thậm chí tự lập hóa đơn dưới dạng 'cơ sở dữ liệu không quản trị'. – Joe

Trả lời

11

Tôi muốn xem một cơ sở dữ liệu nhỏ gọn (cục bộ) chẳng hạn như SQL Server CE hoặc SQLite. Cơ sở dữ liệu được thiết kế cho chính xác điều này.

+0

SQL CE tích hợp đầy đủ vào dòng công cụ Visual Studio, nên dễ nhất cho rằng DB chính là SQL Server, và miễn phí và tự do phân phối lại. –

+0

Có sử dụng SQLite, tôi thích nó. Bạn cũng có thể sử dụng LINQ. – jcollum

+0

+1 cho SQLite Tôi đã sử dụng nó trong nhiều kịch bản bây giờ và nó chỉ đơn giản là tuyệt vời. –

2

Bạn có thể thử sử dụng SQLite hoặc csv file, ví dụ.

5

SQLite is pretty nice, bạn có thể chọn từ nhiều giải pháp DB bị ngắt kết nối nhưng nó thực sự phụ thuộc vào công việc bạn muốn đưa vào đó và tập dữ liệu bạn có.

1

nếu bạn đang sử dụng dữ liệu làm người trung gian và sau đó tải từ đó vào bộ sưu tập, điều gì về việc sử dụng XMLSerialize để tải trực tiếp vào bộ sưu tập của bạn? Bỏ qua người đàn ông trung gian sẽ cho bạn một số lợi ích về hiệu suất.

0

Trước hết ... đó là một đoạn xấu xí để đọc: P

Về câu hỏi của bạn, nếu bạn đang sử dụng .NET, tại sao không đi với SQL Server Compact (file MDF)? Nó giống như làm việc với SQL Server, nhưng dữ liệu được lưu trữ trong một tệp.

Cá nhân tôi nghĩ rằng đó là cách tốt nhất để đi, nhưng nếu bạn muốn lựa chọn sau đó tôi đoán bạn có thể cân nhắc nộp

  • Excel
  • Comma tách tập tin văn bản
  • MS Access Database
  • ?
+0

Chết tiệt! Không có câu trả lời khi tôi bắt đầu viết!Tôi nghĩ tôi nên đăng câu trả lời của mình theo cách nhanh hơn/bẩn hơn và sau đó chỉnh sửa để sửa lỗi/nâng cao/"thanh lịch" chúng! –

1

Tại sao ứng dụng yêu cầu toàn bộ tập dữ liệu mỗi lần? Nếu bạn đang sử dụng cơ sở dữ liệu, bạn nên (imho) xử lý cơ sở dữ liệu tương tự như heap của bạn ...
- Yêu cầu những gì cần thiết vì nó là cần thiết

Một số hoạt động có thể yêu cầu so sánh dữ liệu khác nhau trên toàn bộ cơ sở dữ liệu , nhưng đó là những gì SQL là cho. Thực hiện các hoạt động đó trong cơ sở dữ liệu, không phải trong ứng dụng.

Bạn có tình huống sử dụng trong trường hợp bạn yêu cầu toàn bộ tập dữ liệu trong bộ nhớ không?

2

Nếu có thể không bao giờ thay đổi, tại sao bạn không cung cấp ứng dụng này với cài đặt ứng dụng ngay từ đầu?

Bạn có nhầm lẫn về cụm từ "sẽ không bao giờ thay đổi" thực sự có nghĩa là gì?

Đối với các giải pháp lưu trữ cục bộ, có rất nhiều lựa chọn, như SQLite cho phép bạn sử dụng giải pháp cơ sở dữ liệu, ngay cả khi ở địa phương mà không có bất kỳ rắc rối cài đặt nào.

+0

Tôi đang cung cấp với các ứng dụng instalation. Tôi muốn có nó như là một tập tin tài nguyên. – Brad

+0

Nếu nó thực sự không bao giờ thay đổi, và cung cấp nó với ứng dụng là một cách tiếp cận khả thi, tôi sẽ xem xét việc cài đặt một tệp cơ sở dữ liệu SQLite hoặc tương tự, hoặc để ứng dụng xây dựng tệp cơ sở dữ liệu đó ngay từ lần chạy đầu tiên . Tôi sẽ, trong mọi trường hợp, tải một tệp XML nhiều megabyte để tải dữ liệu, trừ khi tôi cần nó * tất cả *. Nếu tôi chỉ cần một phần dữ liệu, tôi sẽ tải phần đó, và không có gì khác, và điều đó có nghĩa là một cái gì đó khác với XML (hoặc bạn sẽ phải ăn phần mẫu XML đó để trích xuất các phần liên quan.) –

+0

Dữ liệu là lịch sử và được sử dụng để tạo biểu đồ dữ liệu hiệu suất. Sẽ có sự chờ đợi dữ liệu vào tháng tài nguyên đến tháng - chương trình sẽ yêu cầu những mẩu dữ liệu nhỏ này. Là SQLite chỉ là một tập tin và không phải là một ứng dụng? - bởi vì tôi chỉ có thể cung cấp tệp và cho phép chương trình nối thêm tệp khi cần thiết – Brad

0

Tôi không thích XML, nhưng tôi nghĩ đó là cách để đi nếu dữ liệu hoàn toàn chỉ đọc.

Tôi nghĩ bạn cũng có thể đang viết văn bản XML ở định dạng văn bản XML chuẩn vào đĩa, mặc dù bạn sử dụng một lớp có Binary trong tên. Mở nó ra, có một cái nhìn. (Sử dụng công cụ Unix Unix (tải xuống một số công cụ Unix nếu bạn chưa có dd) để lấy một tệp mẫu chỉ vài megabyte đầu tiên, mở nó trong Wordpad hoặc tương tự và xem.)

Nếu bạn muốn làm cho nó không dễ dàng đọc được, hãy xem xét sử dụng mã hóa.

EDIT

Đó là NẾU máy trạm của bạn được khá nhiều dành riêng cho công việc và gắn bó 173MB dữ liệu trong RAM, và làm việc từ đó chứ không phải loay hoay với SQL xảy ra làm cho tinh thần kinh doanh tốt.

0

Tại sao không để lại dữ liệu trên máy chủ và sử dụng một số bộ đệm ẩn Dữ liệu tiêu chuẩn? Tạo truy vấn trả về 180Mb dữ liệu giống như một vấn đề thiết kế.

Tôi tin rằng một giải pháp phù hợp hơn cho xu hướng lịch sử sẽ là chỉ truy xuất những bản ghi hiện đang được hiển thị. Khi bạn muốn phóng to một phần của biểu đồ, chỉ lấy dữ liệu được phóng to.

Về serialization nhị phân của bạn, bạn nên serialize trực tiếp-FileStream:

using (FileStream fileStream = new 
    FileStream("brad.bin", FileMode.Create, FileAccess.Write)) 
{ 
    new BinaryFormatter().Serialize(fileStream, timeData); 
} 
Các vấn đề liên quan