Как может я оценивать использование памяти станд.:: карта?

Вы должны установить QFormLayout в макете tab1, чтобы исключить следующее:

self.p1_vertical.addLayout(form)

и добавляет:

self.vbox.addLayout(form)

Хотя для лучшей организации я предпочитаю создавать новые классы:

from __future__ import division, print_function
import sys
from PyQt4 import QtGui, QtCore

class DataSelectionWidget(QtGui.QWidget):
    def __init__(self, parent=None):
        super(DataSelectionWidget, self).__init__(parent)

        self.btn_cat = QtGui.QPushButton("Select category")
        self.btn_cat.clicked.connect(self.getcat)
        self.le3 = QtGui.QLineEdit(readOnly=True)
        flay = QtGui.QFormLayout(self)
        flay.addRow(self.btn_cat, self.le3)

        # selected dir label
        self.lbl_dir = QtGui.QLabel('Data directory not selected')
        flay.addRow(self.lbl_dir)

        # button label for datadir
        btn_dir = QtGui.QPushButton('Browse...', self)
        flay.addRow(btn_dir)
        btn_dir.clicked.connect(self.get_dirname)

    @QtCore.pyqtSlot()
    def getcat(self):
        cats = ['option 1', 'option 2'] 
        category, ok = QtGui.QInputDialog.getItem(self, "select category", 
            "Option", cats, 0, False)
        if ok:
            self.le3.setText(category)
            self.category = category        

    @QtCore.pyqtSlot()
    def get_dirname(self):
        print('yes')


class ToolsWidget(QtGui.QWidget):
    def __init__(self, parent=None):
        super(ToolsWidget, self).__init__(parent)
        lay = QtGui.QVBoxLayout(self)

        self.lblrun = QtGui.QLabel('Run')
        lay.addWidget(self.lblrun)

        # button for run
        btn_run = QtGui.QPushButton('Run', self)
        lay.addWidget(btn_run)
        btn_run.clicked.connect(self.run)

    @QtCore.pyqtSlot()
    def run(self):
        print('yes')


class Tester(QtGui.QWidget):
    def __init__(self, parent=None):
        # create GUI
        super(Tester, self).__init__(parent)
        self.setWindowTitle('Data tool')
        # window dimensions
        self.resize(300, 75)
        tab1 = DataSelectionWidget()
        tab2 = ToolsWidget()
        # tabbing on
        tab_widget = QtGui.QTabWidget()
        tab_widget.addTab(tab1, "Data selection")
        tab_widget.addTab(tab2, "Tools")

        lay = QtGui.QVBoxLayout(self)
        lay.addWidget(tab_widgetn)


if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    gui = Tester()
    gui.show()
    sys.exit(app.exec_())
42
задан ulidtko 12 February 2014 в 19:45
поделиться

5 ответов

Оценка была бы ближе к

(sizeof(A) + sizeof(B) + ELEMENT_OVERHEAD) * N + CONTAINER_OVERHEAD

Существуют издержки для каждого элемента, который Вы добавляете, и существуют также фиксированные издержки для поддержания структуры данных, используемой для структуры данных, хранящей карту. Это обычно - двоичное дерево, такое как Красно-черное Дерево. Например, в C++ GCC реализация STL ELEMENT_OVERHEAD был бы sizeof(_Rb_tree_node_base) и CONTAINER_OVERHEAD был бы sizeof(_Rb_tree). Вышеупомянутому числу необходимо также добавить издержки структур управления памятью, используемых для хранения элементов карты.

Вероятно, легче прийти к оценке путем измерения потребления памяти кода для различного большого количества.

35
ответ дан Diomidis Spinellis 26 November 2019 в 23:47
поделиться

Если Вы действительно хотите знать объем потребляемой памяти во время выполнения, используйте пользовательское средство выделения и передайте его в при создании карты. См. книгу Josuttis и эту страницу его (для пользовательского средства выделения).

Возможно, легче попросить верхнюю границу?

Верхняя граница будет зависеть от точной реализации (например, особая разновидность используемого сбалансированного дерева). Возможно, можно ли сказать нам, почему Вам нужна эта информация, таким образом, мы можем помочь лучше?

14
ответ дан dirkgently 26 November 2019 в 23:47
поделиться

Вы могли использовать MemTrack Curtis Bartley. Это - средство выделения памяти, которое заменяет по умолчанию и может разыскать использование памяти к типу выделения.

Пример вывода:

-----------------------
Memory Usage Statistics
-----------------------

allocated type                        blocks          bytes  
--------------                        ------          -----  
struct FHRDocPath::IndexedRec          11031  13.7% 2756600  45.8%
class FHRDocPath                       10734  13.3%  772848  12.8%
class FHRDocElemPropLst                13132  16.3%  420224   7.0%
struct FHRDocVDict::IndexedRec          3595   4.5%  370336   6.2%
struct FHRDocMDict::IndexedRec         13368  16.6%  208200   3.5%
class FHRDocObject *                      36   0.0%  172836   2.9%
struct FHRDocData::IndexedRec            890   1.1%  159880   2.7%
struct FHRDocLineTable::IndexedRec       408   0.5%  152824   2.5%
struct FHRDocMList::IndexedRec          2656   3.3%  119168   2.0%
class FHRDocMList                       1964   2.4%   62848   1.0%
class FHRDocVMpObj                      2096   2.6%   58688   1.0%
class FHRDocProcessColor                1259   1.6%   50360   0.8%
struct FHRDocTextBlok::IndexedRec        680   0.8%   48756   0.8%
class FHRDocUString                     1800   2.2%   43200   0.7%
class FHRDocGroup                        684   0.8%   41040   0.7%
class FHRDocObject * (__cdecl*)(void)     36   0.0%   39928   0.7%
class FHRDocXform                        516   0.6%   35088   0.6%
class FHRDocTextColumn                   403   0.5%   33852   0.6%
class FHRDocTString                      407   0.5%   29304   0.5%
struct FHRDocUString::IndexedRec        1800   2.2%   27904   0.5%
18
ответ дан Xavier Nodet 26 November 2019 в 23:47
поделиться

Формула больше похожа:

(sizeof(A) + sizeof(B) + factor) * N

где фактор на запись наверху. Карты C++ обычно реализуются как красно-черные деревья. Это двоичные деревья, таким образом, будет по крайней мере два указателя для слева/справа узлы. Также будет некоторый материал реализации - вероятно, родительский указатель и "цветной" индикатор, таким образом, фактор сможет быть чем-то как

(sizeof( RBNode *) * 3 + 1) / 2

Однако все это является очень зависящим от реализации - для обнаружения наверняка, что действительно необходимо исследовать код на собственную реализацию библиотеки.

0
ответ дан 26 November 2019 в 23:47
поделиться

Размер карты действительно зависит от реализации карты. У Вас могли бы быть различные размеры на различных компиляторах/платформах, в зависимости от которой реализации STL они обеспечивают.

Почему Вам нужен этот размер?

-1
ответ дан Cătălin Pitiș 26 November 2019 в 23:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: