您如何序列化具有10 ^ 9值的大型数组?

时间:2010-09-20 01:28:23

标签: arrays serialization

当使用10 ^ 8项但不使用10 ^ 7时,这会引发内存不足异常。你如何序列化一个包含10 ^ 9值的数组,以便它可以存储在数据库中?

Dim List((10 ^ 9) - 1) As Int64
For i = 1 To (10 ^ 9)
    List(i - 1) = i
Next
Dim Format As New Runtime.Serialization.Formatters.Binary.BinaryFormatter
Dim Writer As New System.IO.MemoryStream
Format.Serialize(Writer, List)

[编辑]

这是在64位机器上,内存比每个人都要求的内存多。 8GB,最多可以打印15GB

3 个答案:

答案 0 :(得分:1)

您的示例只是在每个数组元素中存储索引+ 1;你可以在运行时通过计算得到这个,不需要存储或序列化任何东西。

即使您的示例已经构成并且您实际上正在尝试存储10 ^ 9个任意整数,您可能会有很多重复项。在这种情况下,您应该使用稀疏数据结构,而不是数组。

附录: 如果值是主键并且必须是唯一的,那么最好不要存储使用的数字而不是那些数字。

答案 1 :(得分:1)

使用System.IO.BinaryWriter来进行自己的序列化 - 只需在其上调用Write(int)即可。但是,MemoryStream不会支持超过2 ^ 31个值,因此您需要将其写入其他类型的流。 UnmanagedMemoryStream是可能的,或者您的数据库客户端可能提供专门用于存储大二进制值的内容。 (我不知道你写的是什么类型的数据库。)

答案 2 :(得分:1)

Int64是8个字节;其中1e9是8GB。为了序列化阵列,你必须在内存中加上8GB的数组加{8}的MemoryStream,因此显然需要16GB的内存。目前尚不清楚如何将8GB存储到数据库中,但要完成即时任务,只需要获得更多内存,使数字更小(即Int32),或者流式传输到磁盘而不是内存。 / p>

您打算如何在数据库中存储8GB数据?我所知道的大多数只允许一个值最多为2GB或4GB。