Tôi đang cố gắng sử dụng Protobuf-net để lưu và tải dữ liệu vào đĩa nhưng bị kẹt.Sử dụng Protobuf-net để truyền các tệp dữ liệu lớn như IEnumerable
Tôi có danh mục tài sản mà tôi cần xử lý và tôi muốn có thể làm điều đó nhanh nhất có thể. Tôi đã có thể đọc từ một CSV nhưng nó sẽ nhanh hơn để sử dụng một tập tin nhị phân, vì vậy tôi đang nhìn vào Protobuf-Net.
Tôi không thể phù hợp với tất cả nội dung vào bộ nhớ vì vậy tôi muốn truyền trực tuyến chúng, không tải tất cả chúng vào bộ nhớ.
Vì vậy, những gì tôi cần làm là trưng ra một tập hợp lớn các bản ghi dưới dạng IEnumerable. Điều này có thể thực hiện được với Protobuf-Net không? Tôi đã thử một vài thứ nhưng không thể chạy nó.
Nối tiếp dường như hoạt động, nhưng tôi không thể đọc lại chúng, tôi nhận được 0 nội dung trở lại. Ai đó có thể chỉ cho tôi đi đúng hướng không? Đã xem các phương pháp trong lớp học Serializer
nhưng không thể tìm thấy bất kỳ phương thức nào trong trường hợp này. Tôi sử dụng trường hợp này được hỗ trợ bởi Protobuf-net? Tôi đang sử dụng V2 bằng cách này.
Cảm ơn trước,
Gert-Jan
Dưới đây là một số mẫu mã tôi đã cố gắng:
public partial class MainWindow : Window {
// Generate x Assets
IEnumerable<Asset> GenerateAssets(int Count) {
var rnd = new Random();
for (int i = 1; i < Count; i++) {
yield return new Asset {
ID = i,
EAD = i * 12345,
LGD = (float)rnd.NextDouble(),
PD = (float)rnd.NextDouble()
};
}
}
// write assets to file
private void Write(string path, IEnumerable<Asset> assets){
using (var file = File.Create(path)) {
Serializer.Serialize<IEnumerable<Asset>>(file, assets);
}
}
// read assets from file
IEnumerable<Asset> Read(string path) {
using (var file = File.OpenRead(path)) {
return Serializer.DeserializeItems<Asset>(file, PrefixStyle.None, -1);
}
}
// try it
private void Test() {
Write("Data.bin", GenerateAssets(100)); // this creates a file with binary gibberish that I assume are the assets
var x = Read("Data.bin");
MessageBox.Show(x.Count().ToString()); // returns 0 instead of 100
}
public MainWindow() {
InitializeComponent();
}
private void button2_Click(object sender, RoutedEventArgs e) {
Test();
}
}
[ProtoContract]
class Asset {
[ProtoMember(1)]
public int ID { get; set; }
[ProtoMember(2)]
public double EAD { get; set; }
[ProtoMember(3)]
public float LGD { get; set; }
[ProtoMember(4)]
public float PD { get; set; }
}
Xin lỗi tôi không thể Help- đã có một vài ngày nữa. Rất vui khi bạn tìm thấy câu trả lời. –
không phải lo lắng quá lâu. Một lời cảm ơn chính đối với bạn (viết lại) toàn bộ điều! – gjvdkamp