【问题标题】:discord.py: too big variable?discord.py:变量太大?
【发布时间】:2022-01-26 19:01:55
【问题描述】:

我对 python 和编程很陌生,我正在寻找一个不和谐的机器人,它有很多手写的聊天行,可以随机选择并发回给用户。制作一个包含句子列表的非常大的变量似乎是个坏主意。有没有办法可以将聊天线存储在不同的文件中,并让机器人从该文件中的行中选择?或者还有什么更好的方法,我该怎么做?

【问题讨论】:

    标签: python discord discord.py


    【解决方案1】:

    您可以将数据存储在一个文件中,该文件名为 response.txt 并在discord bot文件中以open("response.txt").readlines()检索它

    【讨论】:

      【解决方案2】:

      我会将这个问题解释为“变量有多大”,答案很简单。当一个变量成为问题时,它太大了。那么,变量怎么会成为问题呢?最大的问题是机器可能会耗尽内存,OOM 杀手(out-of-memory killer)或类似的东西会停止你的程序。您如何知道您的变量是否导致了这些问题?很简单,你的程序崩溃了。

      如果变量是静态的(其大小在编译时或解释之前完全已知),您可以计算它需要多少 RAM。 (这对 Python 来说有点麻烦,所以在运行时加载它并使用分析器计算它可能更容易。)如果它超过 ~ 500 兆字节,你应该担心。超过一个千兆字节,您可能想要重新考虑您的方法[^0]。那么,你会怎么做呢?

      正如@FishballNooodles 所建议的那样,您可以将数据逐行存储在文件中并将这些行读取到数组中。不幸的是,他们提供的代码仍然会将整个内容读入内存。如果您使用他们提供的代码,您有几个选项,下面列出的并非详尽无遗。

      1. 当您需要一行文本时,从文件中使用随机数量的换行符。您将一次查看一个字符,将其与\n 进行比较,如果您遇到了请求的换行数,请阅读该行。就文件中的行数而言,这是 O(n) 最坏的情况。

      2. 与其将所需的文本存储在给定的索引中,不如将其位置存储在文件中。然后,您可以找到该位置(可能是 O(1)),然后阅读文本。这在程序开始时需要 O(n) 的构建成本,但在运行时会更好。

      3. 使用实际的数据库。通常最好不要重新发明轮子。如果您只是存储纯文本,这可能有点矫枉过正,但不要打折扣。

      [^0]:这些数字实际上只是随机的。如果您控制运行代码的服务器环境,那么您可能会想出一些更精确的路标。

      【讨论】:

        猜你喜欢
        • 2020-05-30
        • 2015-12-06
        • 2018-03-04
        • 2016-04-02
        • 2020-04-29
        • 2020-11-02
        • 2017-05-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多