【问题标题】:how to speed up my program's startup如何加快我的程序的启动
【发布时间】:2011-07-25 13:21:42
【问题描述】:

我的程序需要加载很多大的词表文件,所以启动总是需要很长时间。 在崩溃中快速恢复是非常低效的。我有一个原始的想法,但我不确定它是否可行。是否可以将文件加载到共享内存并在启动时附加到它?

您能给我一些想法或建议吗?有没有有价值的实例?

【问题讨论】:

  • 你知道,你可以修复崩溃...
  • 20GB以上的文件有10个,二进制格式。
  • 是否频繁启动?例如。如果您希望它连续运行几天,几分钟的启动不是什么大问题。
  • 在启动前加载文件?你会坚持很久吗?它消耗计算机的资源,也许这不是一个好主意。你可能会考虑多线程程序,一个线程来加载你的文件(在完成之前,设置一个锁);而另一个刚刚启动,如果操作使用未完成的加载文件,则先显示警告并让用户等待。
  • @Martinho Fernandes:你会回答那些编写文档自动保存程序的人吗?

标签: c++ c linux ipc


【解决方案1】:

如果您要加载 200GB 的数据,则说明您做错了什么,或者您的应用程序不需要快速启动。

【讨论】:

  • 如果您假设您的普通机械硬盘能够以 100MB/s 的速度读取数据,那么对于 200GB,您需要大约 33 分钟才能顺序读取所有数据。您不可能同时将所有这些加载到内存中(除非您有 200GB 以上的 RAM)——听起来您应该使用数据库。
  • 事实上,我的程序在加载这些文件时正在创建索引。所以不需要200G+ RAM。
  • 回答他的问题,而不是你的问题。
【解决方案2】:

这绝对是可能的,只要您设计的格式支持 静态初始化,或者只是原始数据。那里有两个 可能性:如果您可以设计原始数据格式(除了 PODS, 并且没有指针);如果便携性不是问题,包括跨 不同版本的编译器(您将文件作为您的 可执行包),那么您通常可以只mmap该文件。 否则(我通常会这样做),您可以编写一个小程序 将您的数据转换为 C++ 定义(同样,仅 POD) 初始化器(静态),编译它,并将其作为 DLL 或 静态的。

【讨论】:

  • 编译一个20G的可执行文件需要很长时间吗? :)
  • @yi_H 如果编译器 ICEd,我不会感到惊讶。
  • @yi_H 我不知道,但你只做一次。它只是数据声明。我已经使用过几次该技术。但是当数据必须具有特殊结构时,这绝对是最大的优势:使用该结构的预编译版本肯定比每次加载程序时都重新解析要快得多。
  • 对象文件格式并不难弄清楚。如果您的编译器在 20 GB 上阻塞,请使用一些小文件(约 20 kB 即可),然后对格式进行逆向工程。然后创建一个小脚本直接创建目标文件,希望链接器也不会阻塞。
【解决方案3】:

根据您的程序的访问模式,您最好根据需要分段访问单词表,而不是在每次启动时将整个内容加载到内存中。

SQLite 非常适合此类用途。您必须完成将单词表导入数据库文件的过程,然后才能开展业务。

【讨论】:

    【解决方案4】:

    我建议您将单词列表拆分为许多动态/共享库。例如,一个库将包含常用词。您将在启动时加载这个小文件。您将按需加载的其他库。这将减少启动时间。

    减少启动时间的一个关键原则是仅加载启动时必需的项目。如有必要,可以按需加载其他项目。

    【讨论】:

      猜你喜欢
      • 2012-02-02
      • 2013-07-28
      • 2011-01-10
      • 1970-01-01
      • 2020-05-10
      • 2010-09-15
      • 1970-01-01
      • 1970-01-01
      • 2018-09-26
      相关资源
      最近更新 更多