-
Notifications
You must be signed in to change notification settings - Fork 896
Expand file tree
/
Copy pathcontext.py
More file actions
82 lines (61 loc) · 2.19 KB
/
context.py
File metadata and controls
82 lines (61 loc) · 2.19 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# -*- coding: utf-8 -*-
import logging
import os
import psutil
import sys
import cv2
from joblib import Parallel, parallel_backend, delayed
logger = logging.getLogger(__name__)
abspath = os.path.abspath(os.path.dirname(__file__))
SENSOR = os.path.join(abspath, 'data', 'sensor_data.json')
BOW_PATH = os.path.join(abspath, 'data', 'bow')
# Handle different OpenCV versions
OPENCV3 = int(cv2.__version__.split('.')[0]) >= 3
if hasattr(cv2, 'flann_Index'):
flann_Index = cv2.flann_Index
elif hasattr(cv2, 'flann') and hasattr(cv2.flann, 'Index'):
flann_Index = cv2.flann.Index
else:
logger.warning('Unable to find flann Index')
flann_Index = None
# Parallel processes
def parallel_map(func, args, num_proc, max_batch_size=1):
"""Run function for all arguments using multiple processes."""
# De-activate/Restore any inner OpenCV threading
threads_used = cv2.getNumThreads()
cv2.setNumThreads(0)
num_proc = min(num_proc, len(args))
if num_proc <= 1:
res = list(map(func, args))
else:
with parallel_backend('loky', n_jobs=num_proc):
batch_size = max(1, int(len(args) / (num_proc * 2)))
batch_size = min(batch_size, max_batch_size) if max_batch_size else batch_size
res = Parallel(batch_size=batch_size)(delayed(func)(arg) for arg in args)
cv2.setNumThreads(threads_used)
return res
# Memory usage
if sys.platform == 'darwin':
rusage_unit = 1
else:
rusage_unit = 1024
def memory_available():
"""Available memory in MB.
Only works on linux and returns None otherwise.
"""
lines = os.popen('free -t -m').readlines()
if not lines:
return None
available_mem = int(lines[1].split()[6])
return available_mem
def processes_that_fit_in_memory(desired, per_process):
"""Amount of parallel BoW process that fit in memory."""
available_mem = memory_available()
if available_mem is not None:
fittable = max(1, int(available_mem / per_process))
return min(desired, fittable)
else:
return desired
def current_memory_usage():
return psutil.Process(os.getpid()).memory_info().rss
#return resource.getrusage(resource.RUSAGE_SELF).ru_maxrss * rusage_unit