【发布时间】:2021-02-02 17:22:29
【问题描述】:
我才刚开始接触 Nim,因此这可能是一个简单的问题。我们需要对存储在文件中的数据进行多次查找。其中一些文件太大而无法加载到内存中,因此采用 mmapped 方法。我可以通过 memfiles 对文件进行映射,并且我手边有一个指针或 MemSlice。文件和内存区域是只读的,因此具有固定大小。我希望我能够以不可变的固定大小字节和字符数组的形式访问数据而无需复制它们,利用所有现有的可用于 seq、数组、字符串等的功能。所有的 MemSlice /字符串方法复制数据,这是公平的,但不是我想要的(在我的用例中不需要)。
我了解数组、字符串等类型有一个指向数据的指针和一个 len 字段。但是找不到用指针和 len 创建它们的方法。我认为这与所有权有关,并且对 mem 的引用可能比我的切片寿命更长。
let mm = memfiles.open(...)
let myImmutableFixesSizeArr = ?? # cast[ptr array[fsize, char]](mm.mem) doesn't compile as fsize needs to be const. Neither could I find something like let x: [char] = array_from(mm.mem, fsize)
let myImmutableFixedSizeString = mm[20, 30].to_fixed_size_immutable_string # Create something that is string like so that I can use all the existing string methods.
更新:我确实找到了 https://forum.nim-lang.org/t/4680#29226,它解释了如何使用 OpenArray,但 OpenArray 只允许作为函数参数,而且你 - 如果我没记错的话 - 它的行为不像普通数组。
感谢您的帮助
【问题讨论】:
-
您需要对这些字符串进行什么样的处理?它们是空终止的吗?