【问题标题】:Read huge file from disk从磁盘读取大文件
【发布时间】:2015-03-27 14:53:25
【问题描述】:

我正在开发一个 iOS 应用程序,我有这个文本文件,每行都有一个城市名称。我在那个文件中有大约 300 万个城市。为了能够对其执行搜索和操作,我使用了 B 树,但是创建此树需要很长时间。每次使用时间都让他等待这个对于用户体验来说是不好的。这一切都没有使用核心数据!

关于如何加快此过程的任何提示?

谢谢

【问题讨论】:

    标签: ios b-tree nsinputstream


    【解决方案1】:

    我的建议是,您使用 SQLite 对要查询的字段(或其他类型的永久索引存储)进行索引,这样用户只需在第一次打开应用程序时等待,然后您可以查询数据库,会快很多。我也相当确定您可以从预生成的文件安装 SQLite 数据库,因此您可以离线生成此索引,将其与您的应用程序捆绑在一起,然后用户根本没有等待时间。不过,我不能 100% 确定这个选项,所以你应该调查一下。

    无论如何,这里没有神奇的解决方案。如果您想要的数据位于文件的 200 万行,则您必须阅读 200 万行文本才能到达该行。我建议找到一种方法来使您的应用程序的用户体验可接受,以便用户在等待数据加载时感觉更好。如果您在数据索引时显示某种带有进度条的漂亮屏幕,则用户将更加宽容这种等待。

    【讨论】:

    • 如果您将文本放入 SQLite 数据库,您就不必每次想要第 2 百万个项目时搜索 200 万个项目。
    • 我认为这将是一个好主意,但不幸的是,对于这种情况,我将无法使用核心数据或任何数据库。棘手!
    • @OP,你可以在没有核心数据的情况下使用 SQLite。有一些库可以让这更容易,我用过的一个是 FMDB (github.com/ccgus/fmdb),但还有很多其他的。
    【解决方案2】:

    B-Tree 显然需要一些时间来创建。如果您不想使用数据库但坚持使用自己的 B-Tree 实现,则可以将树数据转储到单独的文件中,并在程序启动时加载该文件,而不是每次都重新创建它。但是,每次修改源数据时,您都必须更新缓存树。

    在 Python 中,pickle 模块可以帮助您,但大多数编程语言都会有一个序列化模块。

    【讨论】:

    • 你不能在IOS上使用解释型语言。
    • 我没有意识到这是一个 iOS 特定的问题。但是,根据维基百科,Objective C 支持序列化:en.wikipedia.org/wiki/…
    【解决方案3】:

    此文件是否随应用程序一起提供?如果是这样,那么您已经可以将文件文件处理到 SQLite 数据库中。在发布包含数据库的应用程序之前。然后,您可以使用“选择”语句使用索引字段(如城市名称)搜索数据。

    如果文件更改。然后仍然附带一个数据库,只需将修改作为文件发送。这将编辑数据库以使其恢复最新。您可能需要为文件中的每一行添加一个命令,例如 REPLACE、NEW、DELETE。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-13
      • 2020-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多