예제 #1
0
        private static IEnumerable <Reader.Metadata> LoadMetadata(Reader reader)
        {
            var segments = GetSegments(reader).ToList();

            var prevMetaDataLookup = new Dictionary <string, Dictionary <string, Reader.Metadata> >();

            foreach (var segment in segments)
            {
                if (!(segment.TableOfContents.ContainsNewObjects ||
                      segment.TableOfContents.HasDaqMxData ||
                      segment.TableOfContents.HasMetaData ||
                      segment.TableOfContents.HasRawData))
                {
                    continue;
                }
                var  metadatas   = reader.ReadMetadata(segment);
                long rawDataSize = 0;
                long nextOffset  = segment.RawDataOffset;

                foreach (var m in metadatas)
                {
                    if (m.RawData.Count == 0 && m.Path.Length > 1)
                    {
                        // apply previous metadata if available
                        if (prevMetaDataLookup.ContainsKey(m.Path[0]) && prevMetaDataLookup[m.Path[0]].ContainsKey(m.Path[1]))
                        {
                            var prevMetaData = prevMetaDataLookup[m.Path[0]][m.Path[1]];
                            if (prevMetaData != null)
                            {
                                m.RawData.Count            = segment.TableOfContents.HasRawData ? prevMetaData.RawData.Count : 0;
                                m.RawData.DataType         = prevMetaData.RawData.DataType;
                                m.RawData.ClrDataType      = prevMetaData.RawData.ClrDataType;
                                m.RawData.Offset           = segment.RawDataOffset + rawDataSize;
                                m.RawData.IsInterleaved    = prevMetaData.RawData.IsInterleaved;
                                m.RawData.InterleaveStride = prevMetaData.RawData.InterleaveStride;
                                m.RawData.Size             = prevMetaData.RawData.Size;
                                m.RawData.Dimension        = prevMetaData.RawData.Dimension;
                            }
                        }
                    }
                    if (m.RawData.IsInterleaved && segment.NextSegmentOffset <= 0)
                    {
                        m.RawData.Count = segment.NextSegmentOffset > 0
                            ? (segment.NextSegmentOffset - m.RawData.Offset + m.RawData.InterleaveStride - 1) /
                                          m.RawData.InterleaveStride
                            : (reader.FileSize - m.RawData.Offset + m.RawData.InterleaveStride - 1) /
                                          m.RawData.InterleaveStride;
                    }
                    if (m.Path.Length > 1)
                    {
                        rawDataSize += m.RawData.Size;
                        nextOffset  += m.RawData.Size;
                    }
                }

                var implicitMetadatas = new List <Reader.Metadata>();
                if (metadatas.All(m => !m.RawData.IsInterleaved && m.RawData.Size > 0))
                {
                    while (nextOffset < segment.NextSegmentOffset ||
                           (segment.NextSegmentOffset == -1 && nextOffset < reader.FileSize))
                    {
                        // Incremental Meta Data see http://www.ni.com/white-paper/5696/en/#toc1
                        foreach (var m in metadatas)
                        {
                            if (m.Path.Length > 1)
                            {
                                var implicitMetadata = new Reader.Metadata()
                                {
                                    Path    = m.Path,
                                    RawData = new Reader.RawData()
                                    {
                                        Count         = m.RawData.Count,
                                        DataType      = m.RawData.DataType,
                                        ClrDataType   = m.RawData.ClrDataType,
                                        Offset        = nextOffset,
                                        IsInterleaved = m.RawData.IsInterleaved,
                                        Size          = m.RawData.Size,
                                        Dimension     = m.RawData.Dimension
                                    },
                                    Properties = m.Properties
                                };
                                implicitMetadatas.Add(implicitMetadata);
                                nextOffset += implicitMetadata.RawData.Size;
                            }
                        }
                    }
                }
                var metadataWithImplicit = metadatas.Concat(implicitMetadatas).ToList();
                foreach (var metadata in metadataWithImplicit)
                {
                    if (metadata.Path.Length == 2)
                    {
                        if (!prevMetaDataLookup.ContainsKey(metadata.Path[0]))
                        {
                            prevMetaDataLookup[metadata.Path[0]] = new Dictionary <string, Reader.Metadata>();
                        }
                        prevMetaDataLookup[metadata.Path[0]][metadata.Path[1]] = metadata;
                    }
                    yield return(metadata);
                }
            }
        }
예제 #2
0
        private static IEnumerable <Reader.Metadata> LoadMetadata(Reader reader)
        {
            var segments = GetSegments(reader).ToList();

            var segmentMetadata = new List <Tuple <Reader.Segment, List <Reader.Metadata> > >();

            Tuple <Reader.Segment, List <Reader.Metadata> > prevSegment = null;

            foreach (var segment in segments)
            {
                var  metadatas   = reader.ReadMetadata(segment);
                long rawDataSize = 0;
                long nextOffset  = segment.RawDataOffset;

                foreach (var m in metadatas)
                {
                    if (m.RawData.Count == 0 && prevSegment != null && m.Path.Length > 1)
                    {
                        // apply previous metadata if available
                        var prevMetaData = prevSegment.Item2.FirstOrDefault(md => md.Path.Length > 1 && md.Path[1] == m.Path[1]);
                        if (prevMetaData != null)
                        {
                            m.RawData.Count            = prevMetaData.RawData.Count;
                            m.RawData.DataType         = prevMetaData.RawData.DataType;
                            m.RawData.ClrDataType      = prevMetaData.RawData.ClrDataType;
                            m.RawData.Offset           = segment.RawDataOffset + rawDataSize;
                            m.RawData.IsInterleaved    = prevMetaData.RawData.IsInterleaved;
                            m.RawData.InterleaveStride = prevMetaData.RawData.InterleaveStride;
                            m.RawData.Size             = prevMetaData.RawData.Size;
                            m.RawData.Dimension        = prevMetaData.RawData.Dimension;
                        }
                    }
                    if (m.RawData.IsInterleaved && segment.NextSegmentOffset <= 0)
                    {
                        m.RawData.Count = segment.NextSegmentOffset > 0
                            ? (segment.NextSegmentOffset - m.RawData.Offset + m.RawData.InterleaveStride - 1) /
                                          m.RawData.InterleaveStride
                            : (reader.FileSize - m.RawData.Offset + m.RawData.InterleaveStride - 1) /
                                          m.RawData.InterleaveStride;
                    }
                    if (m.Path.Length > 1)
                    {
                        rawDataSize += m.RawData.Size;
                        nextOffset  += m.RawData.Size;
                    }
                }

                var implicitMetadatas = new List <Reader.Metadata>();
                if (metadatas.All(m => !m.RawData.IsInterleaved && m.RawData.Size > 0))
                {
                    while (nextOffset < segment.NextSegmentOffset ||
                           (segment.NextSegmentOffset == -1 && nextOffset < reader.FileSize))
                    {
                        // Incremental Meta Data see http://www.ni.com/white-paper/5696/en/#toc1
                        foreach (var m in metadatas)
                        {
                            if (m.Path.Length > 1)
                            {
                                var implicitMetadata = new Reader.Metadata()
                                {
                                    Path    = m.Path,
                                    RawData = new Reader.RawData()
                                    {
                                        Count         = m.RawData.Count,
                                        DataType      = m.RawData.DataType,
                                        ClrDataType   = m.RawData.ClrDataType,
                                        Offset        = nextOffset,
                                        IsInterleaved = m.RawData.IsInterleaved,
                                        Size          = m.RawData.Size,
                                        Dimension     = m.RawData.Dimension
                                    },
                                    Properties = m.Properties
                                };
                                implicitMetadatas.Add(implicitMetadata);
                                nextOffset += implicitMetadata.RawData.Size;
                            }
                        }
                    }
                }
                var metadataWithImplicit = metadatas.Concat(implicitMetadatas).ToList();
                prevSegment = Tuple.Create(segment, metadataWithImplicit);
                segmentMetadata.Add(prevSegment);
            }

            return(segmentMetadata.SelectMany(st => st.Item2));
        }