Почему массив str и массив объектов из одних и тех же данных различаются по использованию памяти? - PullRequest
1 голос
/ 26 апреля 2020

У меня есть большой набор данных текстов и соответствующих им ярлыков. Раньше я читал csv-файлы, используя модуль csv, а затем строил массивы numpy на этих данных, пока не обнаружил, что большие текстовые массивы в numpy неэффективны для памяти.

with open('sample.csv', 'r') as f: 
    data = csv.reader(f.readlines())                                                                                                                                             

texts = np.array([d[0] for d in data])

И это занимает около 13 ГБ памяти. Но когда pandas читает те же самые данные, как будто ничего не происходит, никаких данных в памяти нет. Под этим я подразумеваю, что использование памяти не на 50% и даже не на 20% занимает всего 300 МБ.

data = pd.read_csv('sample.csv')

texts2 = np.array(data['text'])

Единственная разница между массивами texts и texts2 - это тип dtype:

texts.dtype
dtype('<U92569')

texts2.dtype
dtype('O')

1 Ответ

5 голосов
/ 26 апреля 2020

Ваш первый массив использует NumPy строку dtype. Они имеют фиксированную ширину, поэтому каждый элемент массива занимает столько же места, сколько самая длинная строка массива, а длина одной из строк составляет 92569 символов, что увеличивает требования к пространству для более коротких строк.

Ваш второй массив использует объект dtype. Он просто содержит ссылки на кучу обычных Python объектов, поэтому каждый элемент является обычным Python строковым объектом. Существуют дополнительные накладные расходы на каждый элемент объекта, но каждой строке нужно только достаточно места для хранения своих собственных данных, а не достаточно места для самой большой строки в массиве.

Кроме того, NumPy типы юникода всегда используют 4 байт на символ, в то время как Python строковые объекты используют меньше, если строка не содержит старших кодовых точек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...