【问题标题】:Which is the most efficient way to persist a string for retrieving spans of text?持久化字符串以检索文本跨度的最有效方法是什么?
【发布时间】:2013-02-15 21:36:49
【问题描述】:

我需要一种在磁盘上只存储一个大文本而不将其完全加载到内存中的方法。

我的查询是文本跨度的形式,例如:给我位置 x 和位置 x + n 之间的所有文本,不多也不少。我没有经常更改文本。

可能我需要像“持久”B-Tree这样的东西。

它还需要一些 DBMS 功能,例如:

  • 客户端/服务器架构
  • 缓存系统

谢谢

【问题讨论】:

  • 看起来对于 mmap() 来说是一项不错的任务(如果你碰巧住在 unixland 中)

标签: text data-structures nosql bigdata storage-engines


【解决方案1】:

它还需要一些 DBMS 功能,例如:...

那么,为什么不使用 DBMS? 或者甚至是具有查询功能的 NoSQL 解决方案,例如 OrientDB?

我认为你可以这样做。

  1. 将您的文本分块(章节?段落?固定大小?)
  2. 将文本保存在包含(至少)三个字段的表格中:
    TEXT(文本块)
    BEGIN(此块与全文开头的偏移量)
    END(该块相对于全文开头的结束偏移量)

现在您可以编写查询来提取位置 x 和位置 x+n 之间的文本。

SELECT TEXT, BEGIN END  
  FROM TEXT_TABLE  
 WHERE END >= x  
   AND BEGIN <= (x+n)  
ORDER BY BEGIN

最后,您只需提取文本,执行以下操作:
- 从第一行开始:substring(TEXT, (x-BEGIN))
- 从“内部”行:所有 TEXT
- 从最后一行开始:substring(TEXT, 0, (x+n-BEGIN))

显然,您还应该注意“边缘情况”(结果只有一两行、请求的跨度超出范围……)。
但我认为这种方法应该可以轻松解决您的问题。

希望对您有所帮助。
再见,
拉夫

【讨论】:

  • 这是个好主意,在更改文本的情况下,我应该更新整个表格,但在我的场景中这不是一个大问题。使用如此复杂的软件来处理这个简单的查询对我来说有点奇怪。
  • 是的,查询很简单,但是您说您还想要查询功能、客户端/服务器架构、缓存...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-06
  • 2023-03-20
  • 2021-09-28
  • 1970-01-01
  • 1970-01-01
  • 2018-02-21
  • 1970-01-01
相关资源
最近更新 更多