Django 的 "Performing system checks" 需要很长时间 - Dash Plotly
Django's "Performing system checks" takes ages - Dash Plotly
所以我设置了一个由 Django 提供支持的 webpage/webapplication。
以前我使用 MySQL 数据库作为后端,一切都很顺利,但后来我尝试切换到 PostGreSQL.
当我现在尝试在 shell 中启动服务器时,它在“执行系统检查...”过程中一直卡住。
从那里开始,我的计算机使用了大量 CPU 需要很长时间(大约 5-6 分钟),直到最终服务器启动没有问题。
最后,如果我 运行 “python -v manage.py check”,那么我可以看到进程卡在了一个多分钟点数:
import 'django.db.models.sql.compiler' # <_frozen_importlib_external.SourceFileLoader object at 0x7ff640701890>
但是,我使用 pycharm,当我打开 python 控制台时,我可以毫无问题地导入库。
我创建了一个最小示例来追踪问题。它可以通过简单地将它导入到任何地方(例如在项目的 url.py 文件中)然后尝试启动服务器来复制。
ExampleFile.py:
from apolloWebApp.models import DiseaseGeneAssociations
# Load database entries with distinct IDs
def create_network_elements(score_limit):
distinct_diseases = DiseaseGeneAssociations.objects.values('diseaseid').distinct() # query for distinct diseases
distinct_diseases_list = list(distinct_diseases) # [{'diseaseid': 'C0002395'}, ... ]
# Iterate over entries and filter database entries
for disease in distinct_diseases_list:
associated_DisGeneAss_objs = DiseaseGeneAssociations.objects.filter(score__gte=score_limit,
diseaseid=disease["diseaseid"])
# Transform result into list -> Commenting it out fixes the problem
associated_DisGeneAss_objs = list(associated_DisGeneAss_objs)
# dummy return to make sure everything is executed
return associated_DisGeneAss_objs
test = create_network_elements(0.5)
到目前为止我想通了:
似乎在系统检查期间还执行了 SQL-查询,这导致了问题。
但是,如果我注释掉过滤结果 list(associated_DisGeneAss_objs 的强制转换,则检查会在 2 秒后完成。
所以问题是:
- 为什么系统检查要花这么多时间?
- 它真的在系统检查期间完全执行 SQL 查询吗?
- 但为什么要花这么多时间?
- 为什么将演员表注释掉到列表中可以解决问题?
好的,我发现了问题:
问题是由 Dash-Plotly 造成的(在我的例子中我使用了 Dash Cytoscape), because "All of the callbacks in a Dash app are executed with the initial value of their inputs when the app is first loaded.”。
我认为只需将应用程序导入另一个 python 文件就足以触发该执行。
是的,确实是我的数据库太大了,因此导致应用程序触发的查询花费了很多时间。
因此我的解决方案是将查询分解为更高效的请求。
所以我设置了一个由 Django 提供支持的 webpage/webapplication。 以前我使用 MySQL 数据库作为后端,一切都很顺利,但后来我尝试切换到 PostGreSQL.
当我现在尝试在 shell 中启动服务器时,它在“执行系统检查...”过程中一直卡住。 从那里开始,我的计算机使用了大量 CPU 需要很长时间(大约 5-6 分钟),直到最终服务器启动没有问题。
最后,如果我 运行 “python -v manage.py check”,那么我可以看到进程卡在了一个多分钟点数:
import 'django.db.models.sql.compiler' # <_frozen_importlib_external.SourceFileLoader object at 0x7ff640701890>
但是,我使用 pycharm,当我打开 python 控制台时,我可以毫无问题地导入库。
我创建了一个最小示例来追踪问题。它可以通过简单地将它导入到任何地方(例如在项目的 url.py 文件中)然后尝试启动服务器来复制。
ExampleFile.py:
from apolloWebApp.models import DiseaseGeneAssociations
# Load database entries with distinct IDs
def create_network_elements(score_limit):
distinct_diseases = DiseaseGeneAssociations.objects.values('diseaseid').distinct() # query for distinct diseases
distinct_diseases_list = list(distinct_diseases) # [{'diseaseid': 'C0002395'}, ... ]
# Iterate over entries and filter database entries
for disease in distinct_diseases_list:
associated_DisGeneAss_objs = DiseaseGeneAssociations.objects.filter(score__gte=score_limit,
diseaseid=disease["diseaseid"])
# Transform result into list -> Commenting it out fixes the problem
associated_DisGeneAss_objs = list(associated_DisGeneAss_objs)
# dummy return to make sure everything is executed
return associated_DisGeneAss_objs
test = create_network_elements(0.5)
到目前为止我想通了: 似乎在系统检查期间还执行了 SQL-查询,这导致了问题。 但是,如果我注释掉过滤结果 list(associated_DisGeneAss_objs 的强制转换,则检查会在 2 秒后完成。
所以问题是:
- 为什么系统检查要花这么多时间?
- 它真的在系统检查期间完全执行 SQL 查询吗?
- 但为什么要花这么多时间?
- 为什么将演员表注释掉到列表中可以解决问题?
好的,我发现了问题:
问题是由 Dash-Plotly 造成的(在我的例子中我使用了 Dash Cytoscape), because "All of the callbacks in a Dash app are executed with the initial value of their inputs when the app is first loaded.”。 我认为只需将应用程序导入另一个 python 文件就足以触发该执行。 是的,确实是我的数据库太大了,因此导致应用程序触发的查询花费了很多时间。
因此我的解决方案是将查询分解为更高效的请求。