【问题标题】:How to design a file system based on a singlefile on Android and iOS?如何在 Android 和 iOS 上设计基于单个文件的文件系统?
【发布时间】:2022-01-24 11:51:56
【问题描述】:

最近,我正在处理一个需要管理数千个小文件的项目。整个系统将随机读取/写入这些文件。其中一部分是在需要时从网络下载的。由于性能和系统限制,我只能保留 10~20 个文件描述符/句柄。所以我决定创建一个大的单个文件作为我的“磁盘”。然后动态读写文件到里面。

这是我的设计:

  1. 用于序列化元信息的文件头
  2. 保存每个小文件偏移量的索引
  3. 一堆“预分配段”来保存文件
  4. 支持多线程访问

最后,它看起来像一个虚拟文件系统。但我不确定在 Android 和 iOS 上同时读/写同一个文件是否安全。而且我完全不知道如何管理我的“预分配段”的片段。

是否有任何我可以参考的最佳实践或框架?我走对了吗?

【问题讨论】:

  • SQLite 不是一个选项。因为我只有 10MB 的额外内存可用。

标签: android ios file operating-system filesystems


【解决方案1】:

首先:

我不确定在 Android 和 iOS 上同时读取/写入同一个文件是否安全

一方面,它是安全的,因为它不会破坏操作系统、文件系统、其他文件或其他不使用该文件的应用程序。您的并发读写也不会失败。

另一方面,并​​发读写不会是原子的,所以如果你在一个线程中覆盖一个 10K 的文件,而另一个线程正在读取它,你可能会得到一半新一半旧的数据。

其次,这个非原子性问题也适用于您的单文件文件系统框架。在任何情况下,都可以通过锁定正在读取和写入的字节范围来缓解(由您或框架)。

文件系统确实支持文件的字节范围锁定。我可以很容易地找到Android docs。 iOS 似乎采取了不同的方法。

iOS 似乎采用了event-based approach to changes to parts of files。但是,如果您只是直接使用文件系统而不是在单个文件中构建自己的文件系统,那么您需要做的就是atomically replace files
这种方法还有一个equivalent in android

【讨论】:

    【解决方案2】:

    在 Java(Android 世界)中,您可以查看:

    您正在寻找的内容接近于大多数 bitorrent 客户端所做的事情(至少在旧硬盘上以避免碎片),创建给定大小的文件(为磁盘上的整个下载保留空间)然后通过网络下载和服务它的片段!

    根据您的设计,段只是您在文件中保留多少字节用于管理分配的问题。您可以在网络上阅读有关文件系统的信息!

    对iOs世界了解不多...

    【讨论】:

      【解决方案3】:

      我不是 Android/Ios 方面的专家,但我认为在您目前的情况下,问题将是在 io 操作上使用多个线程。如果你想跟进这个地方,我的建议是添加一个中间内存缓冲区,它可以处理更新/删除并异步写入磁盘。 另一个建议是尝试使用已经为您完成所有繁重工作的 sqlite db(带有单个文件的 db)。

      【讨论】:

      • 可惜我的预算只有10M
      • 不确定?你的预算? sqlite (sqlite.org/index.html) 可免费用于个人/商业项目....
      • 对不起,我的意思是我只有 10M 额外的内存可以使用。因为上层系统已经用完了大部分内存,我需要它在 1GB 内存设备上运行。
      【解决方案4】:

      将所有文件放入数据库。用于 Android 的 Sqlite。然后它们在一个文件中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-03-05
        • 2017-07-08
        • 2018-05-05
        • 2012-08-22
        • 1970-01-01
        • 1970-01-01
        • 2012-09-01
        相关资源
        最近更新 更多