2

我正在使用一个应用程序,该应用程序需要在文件中存储 40 000 多个键和值的大型字典,然后在启动时将它们重新加载到字典中......现在我正在使用简单的字符分隔和 split 和一个 for each启动时循环,例如: key1=value1|key2=value2|key3=value3等...

但是,我正在寻找一种更有效的序列化和反序列化字典的方法......同时考虑到序列化数据的大小,因为有很多条目。

4

2 回答 2

4

您可以使用BinaryFormatter
在我的中端机器上:保存时间:390ms 加载时间:359ms 保存的数据约为 1500kb

'save
Dim dict = New Dictionary(Of String, String)
For i = 1 To 40000
    dict.Add("key" & i, "value" & i)
Next
Dim fs As IO.FileStream = New IO.FileStream("d:\test\test.bin", IO.FileMode.OpenOrCreate)
Dim bf As New Runtime.Serialization.Formatters.Binary.BinaryFormatter()
bf.Serialize(fs, dict)
fs.Close()

'load
Dim fsRead As New IO.FileStream("d:\test\test.bin", IO.FileMode.Open)
Dim objTest As Dictionary(Of String, String) = bf.Deserialize(fsRead)
fsRead.Close()
于 2013-08-21T17:51:43.787 回答
0

这在使用堆叠字典时效果很好:

Dim DataDict as New Dictionary(Of String,Dictionary(Of String,String))

这是一个嵌入式字典被序列化以进行读写的工作示例:

Imports System.IO
Module Modules
  Public Sub TestDict()
    Dim DictsToSave As New Dictionary(Of String, Dictionary(Of String, String))
    For DictsToHave = 1 To 10
        Dim SingelDictData As New Dictionary(Of String, String)
        For Values = 1 To 10000
            SingelDictData.Add("Key " & Values.ToString(), "Value " & Values.ToString())
        Next
        DictsToSave.Add("Key " & DictsToHave.ToString(), SingelDictData)
    Next
    Dim WriteResult = WriteMultiSerializedDict("D:\TestDict.Bin", DictsToSave)
    Dim ReadResult As Dictionary(Of String, Dictionary(Of String, String)) = ReadMultiSerializedDict("D:\TestDict.Bin")

End Sub
Public Function WriteMultiSerializedDict(ByVal FullPath As String, ByVal DataDict As Dictionary(Of String, Dictionary(Of String, String))) As Boolean
    Try
        Dim FileStream As IO.FileStream = New FileStream(FullPath, IO.FileMode.OpenOrCreate)
        Dim BinFormatter As New Runtime.Serialization.Formatters.Binary.BinaryFormatter()
        BinFormatter.Serialize(FileStream, DataDict)
        FileStream.Close()
        Return True
    Catch ex As Exception
        Return False
    End Try
End Function
Public Function ReadMultiSerializedDict(ByVal FullPath As String) As Dictionary(Of String, Dictionary(Of String, String))
    Try
        Dim DataDict As New Dictionary(Of String, Dictionary(Of String, String))
        Dim FileStream As IO.FileStream = New FileStream(FullPath, IO.FileMode.Open)
        Dim BinFormatter As New Runtime.Serialization.Formatters.Binary.BinaryFormatter()
        DataDict = BinFormatter.Deserialize(FileStream)
        FileStream.Close()
        Return DataDict
    Catch ex As Exception
        Return Nothing
    End Try
End Function

在我的中端开发机器上,写入大约需要 260 毫秒,读取大约需要 545 毫秒,文件大小为 3.70 mb。重要提示:如果您更改任何 dict 的键(而不是值),加载炸弹!因此,作为编程问题,请始终以相同的顺序组装您的 dicts。我以前使用过这种方法,在子字典中使用 5 100 个键/值对,没有问题。

于 2018-02-13T18:12:38.290 回答