Backport r61458:
Issue 2321: reduce memory usage (increase the memory that is returned to the system) by using pymalloc for the data of unicode objects.
This commit is contained in:
parent
a6f5bf2387
commit
b3635f99a2
|
@ -11,6 +11,8 @@ What's New in Python 2.5.3?
|
|||
|
||||
Core and builtins
|
||||
-----------------
|
||||
- Issue #2321: use pymalloc for unicode object string data to reduce
|
||||
memory usage in some circumstances.
|
||||
|
||||
Library
|
||||
-------
|
||||
|
|
|
@ -200,7 +200,8 @@ int unicode_resize(register PyUnicodeObject *unicode,
|
|||
it contains). */
|
||||
|
||||
oldstr = unicode->str;
|
||||
PyMem_RESIZE(unicode->str, Py_UNICODE, length + 1);
|
||||
unicode->str = PyObject_REALLOC(unicode->str,
|
||||
sizeof(Py_UNICODE) * (length + 1));
|
||||
if (!unicode->str) {
|
||||
unicode->str = (Py_UNICODE *)oldstr;
|
||||
PyErr_NoMemory();
|
||||
|
@ -249,20 +250,23 @@ PyUnicodeObject *_PyUnicode_New(Py_ssize_t length)
|
|||
never downsize it. */
|
||||
if ((unicode->length < length) &&
|
||||
unicode_resize(unicode, length) < 0) {
|
||||
PyMem_DEL(unicode->str);
|
||||
PyObject_DEL(unicode->str);
|
||||
goto onError;
|
||||
}
|
||||
}
|
||||
else {
|
||||
unicode->str = PyMem_NEW(Py_UNICODE, length + 1);
|
||||
size_t new_size = sizeof(Py_UNICODE) * ((size_t)length + 1);
|
||||
unicode->str = (Py_UNICODE*) PyObject_MALLOC(new_size);
|
||||
}
|
||||
PyObject_INIT(unicode, &PyUnicode_Type);
|
||||
}
|
||||
else {
|
||||
size_t new_size;
|
||||
unicode = PyObject_New(PyUnicodeObject, &PyUnicode_Type);
|
||||
if (unicode == NULL)
|
||||
return NULL;
|
||||
unicode->str = PyMem_NEW(Py_UNICODE, length + 1);
|
||||
new_size = sizeof(Py_UNICODE) * ((size_t)length + 1);
|
||||
unicode->str = (Py_UNICODE*) PyObject_MALLOC(new_size);
|
||||
}
|
||||
|
||||
if (!unicode->str) {
|
||||
|
@ -296,7 +300,7 @@ void unicode_dealloc(register PyUnicodeObject *unicode)
|
|||
unicode_freelist_size < MAX_UNICODE_FREELIST_SIZE) {
|
||||
/* Keep-Alive optimization */
|
||||
if (unicode->length >= KEEPALIVE_SIZE_LIMIT) {
|
||||
PyMem_DEL(unicode->str);
|
||||
PyObject_DEL(unicode->str);
|
||||
unicode->str = NULL;
|
||||
unicode->length = 0;
|
||||
}
|
||||
|
@ -310,7 +314,7 @@ void unicode_dealloc(register PyUnicodeObject *unicode)
|
|||
unicode_freelist_size++;
|
||||
}
|
||||
else {
|
||||
PyMem_DEL(unicode->str);
|
||||
PyObject_DEL(unicode->str);
|
||||
Py_XDECREF(unicode->defenc);
|
||||
unicode->ob_type->tp_free((PyObject *)unicode);
|
||||
}
|
||||
|
@ -7129,8 +7133,8 @@ unicode_subscript(PyUnicodeObject* self, PyObject* item)
|
|||
return PyUnicode_FromUnicode(NULL, 0);
|
||||
} else {
|
||||
source_buf = PyUnicode_AS_UNICODE((PyObject*)self);
|
||||
result_buf = (Py_UNICODE *)PyMem_MALLOC(slicelength*
|
||||
sizeof(Py_UNICODE));
|
||||
result_buf = (Py_UNICODE *)PyObject_MALLOC(slicelength*
|
||||
sizeof(Py_UNICODE));
|
||||
|
||||
if (result_buf == NULL)
|
||||
return PyErr_NoMemory();
|
||||
|
@ -7140,7 +7144,7 @@ unicode_subscript(PyUnicodeObject* self, PyObject* item)
|
|||
}
|
||||
|
||||
result = PyUnicode_FromUnicode(result_buf, slicelength);
|
||||
PyMem_FREE(result_buf);
|
||||
PyObject_FREE(result_buf);
|
||||
return result;
|
||||
}
|
||||
} else {
|
||||
|
@ -7948,7 +7952,7 @@ unicode_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
|||
Py_DECREF(tmp);
|
||||
return NULL;
|
||||
}
|
||||
pnew->str = PyMem_NEW(Py_UNICODE, n+1);
|
||||
pnew->str = (Py_UNICODE*) PyObject_MALLOC(sizeof(Py_UNICODE) * (n+1));
|
||||
if (pnew->str == NULL) {
|
||||
_Py_ForgetReference((PyObject *)pnew);
|
||||
PyObject_Del(pnew);
|
||||
|
@ -8075,7 +8079,7 @@ _PyUnicode_Fini(void)
|
|||
PyUnicodeObject *v = u;
|
||||
u = *(PyUnicodeObject **)u;
|
||||
if (v->str)
|
||||
PyMem_DEL(v->str);
|
||||
PyObject_DEL(v->str);
|
||||
Py_XDECREF(v->defenc);
|
||||
PyObject_Del(v);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue