Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
疯人忠
Cvat
提交
d29b84c3
C
Cvat
项目概览
疯人忠
/
Cvat
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
C
Cvat
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
d29b84c3
编写于
6月 20, 2023
作者:
A
Andrey Zhavoronkov
提交者:
GitHub
6月 20, 2023
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Hotfix 2.4.7 (#6342)
上级
f8bb591e
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
37 addition
and
14 deletion
+37
-14
cvat/apps/dataset_manager/task.py
cvat/apps/dataset_manager/task.py
+3
-6
cvat/apps/dataset_manager/util.py
cvat/apps/dataset_manager/util.py
+22
-3
cvat/apps/engine/migrations/0070_add_job_type_created_date.py
.../apps/engine/migrations/0070_add_job_type_created_date.py
+1
-1
cvat/apps/quality_control/quality_reports.py
cvat/apps/quality_control/quality_reports.py
+11
-4
未找到文件。
cvat/apps/dataset_manager/task.py
浏览文件 @
d29b84c3
...
@@ -22,7 +22,7 @@ from cvat.apps.profiler import silk_profile
...
@@ -22,7 +22,7 @@ from cvat.apps.profiler import silk_profile
from
cvat.apps.dataset_manager.annotation
import
AnnotationIR
,
AnnotationManager
from
cvat.apps.dataset_manager.annotation
import
AnnotationIR
,
AnnotationManager
from
cvat.apps.dataset_manager.bindings
import
TaskData
,
JobData
,
CvatImportError
from
cvat.apps.dataset_manager.bindings
import
TaskData
,
JobData
,
CvatImportError
from
cvat.apps.dataset_manager.formats.registry
import
make_exporter
,
make_importer
from
cvat.apps.dataset_manager.formats.registry
import
make_exporter
,
make_importer
from
cvat.apps.dataset_manager.util
import
add_prefetch_fields
,
bulk_create
from
cvat.apps.dataset_manager.util
import
add_prefetch_fields
,
bulk_create
,
get_cached
class
dotdict
(
OrderedDict
):
class
dotdict
(
OrderedDict
):
...
@@ -105,17 +105,14 @@ class JobAnnotation:
...
@@ -105,17 +105,14 @@ class JobAnnotation:
def
__init__
(
self
,
pk
,
*
,
is_prefetched
=
False
,
queryset
=
None
):
def
__init__
(
self
,
pk
,
*
,
is_prefetched
=
False
,
queryset
=
None
):
if
queryset
is
None
:
if
queryset
is
None
:
queryset
=
self
.
add_prefetch_info
(
models
.
Job
.
objects
)
.
all
()
queryset
=
self
.
add_prefetch_info
(
models
.
Job
.
objects
)
if
is_prefetched
:
if
is_prefetched
:
self
.
db_job
:
models
.
Job
=
queryset
.
select_related
(
self
.
db_job
:
models
.
Job
=
queryset
.
select_related
(
'segment__task'
'segment__task'
).
select_for_update
().
get
(
id
=
pk
)
).
select_for_update
().
get
(
id
=
pk
)
else
:
else
:
try
:
self
.
db_job
:
models
.
Job
=
get_cached
(
queryset
,
pk
=
int
(
pk
))
self
.
db_job
:
models
.
Job
=
next
(
job
for
job
in
queryset
if
job
.
pk
==
int
(
pk
))
except
StopIteration
as
ex
:
raise
models
.
Job
.
DoesNotExist
from
ex
db_segment
=
self
.
db_job
.
segment
db_segment
=
self
.
db_job
.
segment
self
.
start_frame
=
db_segment
.
start_frame
self
.
start_frame
=
db_segment
.
start_frame
...
...
cvat/apps/dataset_manager/util.py
浏览文件 @
d29b84c3
...
@@ -10,7 +10,7 @@ import os, os.path as osp
...
@@ -10,7 +10,7 @@ import os, os.path as osp
import
zipfile
import
zipfile
from
django.conf
import
settings
from
django.conf
import
settings
from
django.db
.models
import
QuerySet
from
django.db
import
models
def
current_function_name
(
depth
=
1
):
def
current_function_name
(
depth
=
1
):
...
@@ -40,16 +40,35 @@ def bulk_create(db_model, objects, flt_param):
...
@@ -40,16 +40,35 @@ def bulk_create(db_model, objects, flt_param):
return
[]
return
[]
def
is_prefetched
(
queryset
:
QuerySet
,
field
:
str
)
->
bool
:
def
is_prefetched
(
queryset
:
models
.
QuerySet
,
field
:
str
)
->
bool
:
return
field
in
queryset
.
_prefetch_related_lookups
return
field
in
queryset
.
_prefetch_related_lookups
def
add_prefetch_fields
(
queryset
:
QuerySet
,
fields
:
Sequence
[
str
])
->
QuerySet
:
def
add_prefetch_fields
(
queryset
:
models
.
QuerySet
,
fields
:
Sequence
[
str
])
->
models
.
QuerySet
:
for
field
in
fields
:
for
field
in
fields
:
if
not
is_prefetched
(
queryset
,
field
):
if
not
is_prefetched
(
queryset
,
field
):
queryset
=
queryset
.
prefetch_related
(
field
)
queryset
=
queryset
.
prefetch_related
(
field
)
return
queryset
return
queryset
def
get_cached
(
queryset
:
models
.
QuerySet
,
pk
:
int
)
->
models
.
Model
:
"""
Like regular queryset.get(), but checks for the cached values first
instead of just making a request.
"""
# Read more about caching insights:
# https://www.mattduck.com/2021-01-django-orm-result-cache.html
# The field is initialized on accessing the query results, eg. on iteration
if
getattr
(
queryset
,
'_result_cache'
):
result
=
next
((
obj
for
obj
in
queryset
if
obj
.
pk
==
pk
),
None
)
else
:
result
=
None
if
result
is
None
:
result
=
queryset
.
get
(
id
=
pk
)
return
result
def
deepcopy_simple
(
v
):
def
deepcopy_simple
(
v
):
# Default deepcopy is very slow
# Default deepcopy is very slow
...
...
cvat/apps/engine/migrations/0070_add_job_type_created_date.py
浏览文件 @
d29b84c3
...
@@ -11,7 +11,7 @@ def add_created_date_to_existing_jobs(apps, schema_editor):
...
@@ -11,7 +11,7 @@ def add_created_date_to_existing_jobs(apps, schema_editor):
task
=
job
.
segment
.
task
task
=
job
.
segment
.
task
job
.
created_date
=
task
.
created_date
job
.
created_date
=
task
.
created_date
Job
.
objects
.
bulk_update
(
jobs
,
fields
=
[
'created_date'
])
Job
.
objects
.
bulk_update
(
jobs
,
fields
=
[
'created_date'
]
,
batch_size
=
500
)
class
Migration
(
migrations
.
Migration
):
class
Migration
(
migrations
.
Migration
):
...
...
cvat/apps/quality_control/quality_reports.py
浏览文件 @
d29b84c3
...
@@ -2241,10 +2241,9 @@ class QualityReportUpdateManager:
...
@@ -2241,10 +2241,9 @@ class QualityReportUpdateManager:
except
Task
.
DoesNotExist
:
except
Task
.
DoesNotExist
:
return
return
# Try to use shared queryset to minimize DB requests
# Try to use a shared queryset to minimize DB requests
job_queryset
=
Job
.
objects
.
prefetch_related
(
"segment"
)
job_queryset
=
Job
.
objects
.
select_related
(
"segment"
)
job_queryset
=
JobDataProvider
.
add_prefetch_info
(
job_queryset
)
job_queryset
=
job_queryset
.
filter
(
segment__task_id
=
task_id
)
job_queryset
=
job_queryset
.
filter
(
segment__task_id
=
task_id
).
all
()
# The GT job could have been removed during scheduling, so we need to check it exists
# The GT job could have been removed during scheduling, so we need to check it exists
gt_job
:
Job
=
next
(
gt_job
:
Job
=
next
(
...
@@ -2258,6 +2257,14 @@ class QualityReportUpdateManager:
...
@@ -2258,6 +2257,14 @@ class QualityReportUpdateManager:
# - job updated -> job report is computed
# - job updated -> job report is computed
# old reports can be reused in this case (need to add M-1 relationship in reports)
# old reports can be reused in this case (need to add M-1 relationship in reports)
# Add prefetch data to the shared queryset
# All the jobs / segments share the same task, so we can load it just once.
# We reuse the same object for better memory use (OOM is possible otherwise).
# Perform manual "join", since django can't do this.
gt_job
=
JobDataProvider
.
add_prefetch_info
(
job_queryset
).
get
(
id
=
gt_job
.
id
)
for
job
in
job_queryset
:
job
.
segment
.
task
=
gt_job
.
segment
.
task
# Preload all the data for the computations
# Preload all the data for the computations
# It must be done in a single transaction and before all the remaining computations
# It must be done in a single transaction and before all the remaining computations
# because the task and jobs can be changed after the beginning,
# because the task and jobs can be changed after the beginning,
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录