当使用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
答案 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。