【问题标题】:Is it advisable to store large strings in memory, or repeatedly read a file?是否建议将大字符串存储在内存中,或重复读取文件?
【发布时间】:2012-04-18 04:44:08
【问题描述】:

假设我有各种 text/json/xml/whatever 文件(本地存储在 assets 目录中),大小从 20 到 500 KB。假设这些文件将在整个应用程序中被频繁引用,是否更好:

A) 在第一次请求时读取文件一次,并将数据存储在变量中

B) 每次请求时读取文件,获取请求的信息,然后让 GC 清理?

来自web-dev,我通常使用选项(A),但我想知道移动设备的存储限制是否使B在这种情况下更受欢迎(Android应用程序开发)。

TYIA。

【问题讨论】:

  • 我不认为 500kb 太大而无法存储..
  • 中间地带可能是通过 gzip 保留对压缩字节的引用。话又说回来,500kb 并不是那么大。
  • 这不是也取决于文件的数量吗?我的意思是,如果它只有几个 500kB,那么将它存储在内存中是可行的。但是,如果有几千个 500kB 文件的情况不太可能发生呢?

标签: java android


【解决方案1】:

您可以通过压缩将数据存储到内存中。它会在任何时候减少您的内存占用。因此该技术可以适用于PC和手机。稍后当您需要数据时,读取和解压。所以读取文件一次,然后压缩并存储在内存中。下面的例子使用GZIPOutputStream压缩一个字符串。

public static String compress(String str){
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    GZIPOutputStream gzip = new GZIPOutputStream(out);
    gzip.write(str.getBytes());
    gzip.close();
    return out.toString("ISO-8859-1");
 }

【讨论】:

  • 您能解释一下如何按照您建议的方式压缩 XML 或 JSON 数据吗?
  • 您可以压缩xml和json,非常类似于字符串数据。将xml或json字符串转换为字节数组并使用GZIPOutputStream编写它。如果数据足够大,这非常有效。
【解决方案2】:

如果文件被频繁请求,肯定最好读取一次文件并存储在缓存中。

您也可以在 HighScalability 网站上阅读标题为 How Google Taught me to Cache and Cash In 的文章。

【讨论】:

    【解决方案3】:

    这取决于文件的总大小、访问频率和您的目标客户。高端手机虽然内存很大,但很多低端系统内存比较少。 它可能应该使用一些 LRU 缓存来达到平衡。

    【讨论】:

      猜你喜欢
      • 2014-09-25
      • 2013-04-08
      • 2012-08-18
      • 2012-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-14
      • 1970-01-01
      相关资源
      最近更新 更多