我正在开发一个项目,我必须加载非常大的文件(高达50 MB)。目前,我正在将这些文件完全加载到(连续)内存中。这样做的优点是我可以很容易地在某些位置更改字节,因为我不知道所有字节的结构。
然而,我的意图也是改变结构,例如删除/添加“块”。现在,我的想法是从其中删除“已知”部分,将它们存储在类中,其中只包含这些部分的数据块,并为这些块创建一个引用列表。
例如:
原始档案:
其结果将是:
ChunkA 1和ChunkA 2实例。ChunkB 1实例
“‘File”实例和带有基偏移量的引用+对所有块的引用。
最后,我必须‘重新创建’或写入原始文件(与更改)回来。
一般来说,这是一个好主意,还是有一些设计模式帮助了我?
发布于 2014-09-02 03:41:35
首先,我同意上述一些评论者的看法,即您所需要的可能只是合理的数据结构。每个数据结构都可以完成一个简单的契约,既可以从某个字节流中读取数据,也可以将其写入一个字节流。对于50 of大小的文件,这可能是您所需要的。在回答的其余部分中考虑到这一点。
然而,我觉得你们可能会在这里试图探究一些更深层次的概念。
首先想到的是缓冲区的效率。我认为这里的一个常见技巧是预先分配已知大小的缓冲区“部件”,并使用缓冲区“部件”的列表。在C#中,IList>的使用可以看作是预先分配数组的有效包装器。见这里。请注意,这些缓冲区大小通常与磁盘扇区大小和内存页大小有关联。预先进行有效的结构定义可以在以后进行有趣的优化。例如,焦油存档格式出于这种原因使用了一个512个字节的头记录。如果您要从TAR中复制文件,您的扇区边界就不会被弄乱,这可能非常好。
其次,我想知道对绳背后的字符串处理设计的研究是否会带来一些启示。它遵循了类似的思路。这将是有用的,取决于您的编辑策略。
https://softwareengineering.stackexchange.com/questions/255045
复制相似问题