#Region "Microsoft.VisualBasic::2ee8556607679bf916d41894466cce0b, Distribute_computing\GridDynamics_plugins\IO\VectorIOExtensions.vb" ' Author: ' ' asuka (amethyst.asuka@gcmodeller.org) ' xie (genetics@smrucc.org) ' xieguigang (xie.guigang@live.com) ' ' Copyright (c) 2018 GPL3 Licensed ' ' ' GNU GENERAL PUBLIC LICENSE (GPL3) ' ' ' This program is free software: you can redistribute it and/or modify ' it under the terms of the GNU General Public License as published by ' the Free Software Foundation, either version 3 of the License, or ' (at your option) any later version. ' ' This program is distributed in the hope that it will be useful, ' but WITHOUT ANY WARRANTY; without even the implied warranty of ' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ' GNU General Public License for more details. ' ' You should have received a copy of the GNU General Public License ' along with this program. If not, see . ' /********************************************************************************/ ' Summaries: ' Module VectorIOExtensions ' ' Function: LoadVector ' ' Sub: Serialize ' ' /********************************************************************************/ #End Region Imports System.IO Imports System.Runtime.CompilerServices Imports Microsoft.VisualBasic.Data.IO Imports Microsoft.VisualBasic.Language Imports Microsoft.VisualBasic.Linq Imports Microsoft.VisualBasic.Math.LinearAlgebra Public Module VectorIOExtensions Public Sub Serialize(vec As Vector, save As Stream, Optional chunkSize% = 1024) Dim chunks = vec.Array.Split(chunkSize) Dim bytes As Byte() Dim ms As MemoryStream Dim buffers As New List(Of MemoryStream) ' chunksize int (校验用) ' chunks int ' index1 long length1 long ' index2 long length2 long ' ... ' gzipchunk1 bytes ' gzipchunk2 bytes ' ... For Each chunk As Double() In chunks bytes = chunk _ .Select(AddressOf BitConverter.GetBytes) _ .IteratesALL _ .ToArray ' 对一个chunk做gzip压缩 ms = New MemoryStream(bytes) '.GZipStream buffers += ms Next Dim writer As New BinaryDataWriter(save) writer.Write(chunkSize) writer.Write(buffers.Count) Dim index As New List(Of (offset&, size&)) Dim offset As Long = 8 + (8 + 8) * buffers.Count For Each chunk As MemoryStream In buffers index += (offset, chunk.Length) offset += chunk.Length Next For Each offsetIndex In index Call writer.Write(offsetIndex.offset) Call writer.Write(offsetIndex.size) Next For Each chunk As MemoryStream In buffers Call writer.Write(chunk) Next Call writer.Flush() End Sub Public Function LoadVector(reads As Stream) As Vector Dim data As New List(Of Double) Using reader As New BinaryDataReader(reads) Dim chunkSize = reader.ReadInt32 Dim chunks = reader.ReadInt32 Dim offset, size As Long Dim buffer As Byte() For i As Integer = 0 To chunks - 1 offset = reader.ReadInt64 size = reader.ReadInt64 reader.Mark() ' goback to original reader.Seek(-(4 + 4 + 16 * (i + 1)), SeekOrigin.Current) ' then goto data offset reader.Seek(offset, SeekOrigin.Current) ' read gzip data chunk and then ungzip buffer = reader.ReadBytes(size) '.UnGzipStream ' back to doubles data += buffer.ToArray _ .Split(8) _ .Select(Function(bytes) Return BitConverter.ToDouble(bytes, Scan0) End Function) reader.Reset() Next End Using Return New Vector(data) End Function End Module