Чтобы проверить накладные расходы на структуру данных в вашем коде, я написал следующую тестовую программу. Предполагается, что ваш текстовый файл был размером N
мегабайт в кодировке ASCII с относительно короткими строками. (Мне пришлось изменить N
с 450 на 150 после того, как моя физическая память закончилась.)
import sys
MB = 1024 * 1024
line = "the quick brown fox jumps over the lazy dog"
megs = 150
nlines = (megs * MB) / len(line)
d = {}
for i in xrange(nlines):
d[i] = line.split(' ')
dict_size = sys.getsizeof(d)
list_size = sum(sys.getsizeof(a) for a in d.items())
item_size = sum(sum(sys.getsizeof(s) for s in a) for a in d.items())
print " dict:", dict_size / float(MB), "MB"
print "lists:", list_size / float(MB), "MB"
print "items:", item_size / float(MB), "MB"
print "total:", (dict_size + list_size + item_size) / float(MB), "MB"
с результатом:
dict: 192.00 MB
lists: 251.16 MB
items: 669.77 MB
total: 1112.9 MB
наблюдая за монитором активности, процесс Python использует более 2 гигабайт памяти, поэтому часть памяти также не учтена. Возможны артефакты реализации malloc
.
Я реализовал ту же программу на C ++:
#include <string>
#include <vector>
#include <unordered_map>
int main()
{
int const MB = 1024 * 1024;
std::string const line = "the quick brown fox jumps over the lazy dog";
std::vector<std::string> const split = {
"the", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog"
};
int const megs = 150;
int const nlines = (megs * MB) / line.size();
std::unordered_map<int, std::vector<std::string>> d;
for (int i = 0; i < nlines; ++i) {
d[i] = split;
}
}
При компиляции с clang++ -O3
использовалось около 1 ГБ памяти. В C ++ нет sys.getsizeof()
, поэтому требуется немного больше работы, чтобы разбить использование памяти, а я этого не делал.
Удвоение объема памяти эквивалентного C ++ на самом деле является довольно хорошим результатом для Python, поэтому я удаляю свои комментарии перед редактированием о реализации cPython.
Я думаю, ваша основная проблема заключается в хранении строки в виде массива коротких строк. Можно ли хранить строки как целые строки и разбивать их по мере необходимости, но не все сразу?
Какова конечная цель вашей программы?
person
japreiss
schedule
21.12.2016