2010-12-31 8 views
3

Мне нужно сохранить данные в памяти. Мои данные типа моих данных - это строка. Я хочу минимизировать использование памяти. Думаю, мне нужно изменить строку в байт. Я прав? Если я конвертирую строку в байт, значит, мне нужно преобразовать строку в TMemoryStream?Строка для байта [delphi]

+0

Трудно понять, что вы имеете в виду здесь. Если у вас есть строковая переменная, она уже хранится в памяти. Можете ли вы дать более подробную информацию о том, что вы пытаетесь сделать? –

+3

До того, как тип строки D2009 был байтовым массивом, так как это был ASCII. Это эквивалентно байтовому массиву с длиной числа символов + 1 для (скрытых в реализации delphi), заканчивающихся нулевым байтом.Поскольку тип строки D2009 является юникодом, и он занимает удвоенное количество байтов. Чтобы преобразовать строку, вы должны обратиться к преобразованиям типа строки. – too

+0

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

ответ

5

Если вы действительно хотите, чтобы преобразовать его, то этот код будет сделать это

var 
    BinarySize: Integer; 
    InputString: string; 
    StringAsBytes: array of Byte; 
begin 
    BinarySize := (Length(InputString) + 1) * SizeOf(Char); 
    SetLength(StringAsBytes, BinarySize); 
    Move(InputString[1], StringAsBytes[0], BinarySize); 

Но, как уже было сказано, это не позволит вам сэкономить память. Их количество будет практически одинаковым. Вы ничего не получите от этого. Если у вас есть много строк, используйте другой подход. Как-то из этого списка вариантов:

  1. Используйте словарь и только хранить каждую строку же раз
  2. только держать часть всех строк в памяти. Какой-то кеш. Имейте других на жестком диске и используйте потоки для их загрузки.
  3. Если у вас очень большая строка, подумайте об их сжатии.
  4. Если вы читаете из файла и задаете двоичные данные, пропустите строку посередине. Прочтите источник непосредственно в буфер байта.

Трудно дать дополнительную помощь, не зная больше о проблеме.

EDIT:

Если вы действительно хотите, минимальный объем памяти, и вы можете жить с немного более низкой скоростью (но по-прежнему очень быстро), вы можете использовать Suffix Trie или B-Tree или событие простого Binary Tree. Они могут работать непосредственно с жесткого диска и могут быть очень быстрыми для поиска. Если вы затем кэшируете подмножество данных в ОЗУ, вы получаете оптимальную память решения и скорость.

В любом случае, учитывая количество данных, которые, как утверждают, кажется, не требует оптимизации памяти. 22 МБ оперативной памяти вряд ли является проблемой и не стоит оптимизировать.

+0

Так что не будет никакого различия в потреблении памяти, если я сохраню свои данные в виде строки или массива байтов. То же самое, если я использую 'AStream: = TMemoryStream.Create; с AStream do WriteBuffer (AText [1], Length (AText)); '? На самом деле я делаю свой второй выбор. – user

+0

Да, это будет то же самое, если вы используете массив строк или байтов или даже TMemoryStream. На самом деле с TMemoryStream вы даже будете использовать больше памяти из-за дополнительного объекта. Как я уже говорил, оптимизация памяти в другом месте. Я указал на несколько вариантов. Я хочу получить более точный ответ, который вам нужно описать в более подробной информации. – Runner

+0

Моя проблема прямо сейчас проста. Я хочу хранить свои данные в памяти, и я хочу оптимизировать использование памяти. Это все. Моя реальная проблема заключается в том, почему я храню свои данные в памяти? На самом деле мои данные представляют собой массив строк. Каждая строка в массиве является частью строки из каждой строки файла. Это моя реализация для сравнения ввода строки с моими данными. Сначала сравните часть ввода с данными в памяти, если совпадение с индексом массива, перепроверьте ввод с чтением данных/строки в файле на основе индекса массива. – user

1

Вы уверены, что это оптимизация, которая необходима?

2000 строк длиной 10 символов - всего 20000 символов.

В большинстве сред, это крошечный. Большинство машин имеют значительно больше оперативной памяти. Большинство дисков значительно больше. И, как правило, отправка и получение такой информации тривиально по сети.

Возможно, ваше положение уникально. Возможно, у вас есть большое количество наборов данных на 20000 символов или очень медленный веб-доступ, через который можно передать эту дату, и т. Д. Но я бы посоветовал вам подумать, не пытаетесь ли вы оптимизировать что-то, даже если вы очень успешное внедрение, существенно не изменит производительность вашего приложения в реальном мире.

+0

Извините, мой плохой. На самом деле это теперь 10600 строк, каждая строка содержит base64. Поэтому я думаю, что мне нужна эта оптимизация. – user

+2

@user Я сомневаюсь, что вам нужна оптимизация. –

0

Сделайте свой тип хранения tutf8string. Его можно просто назначить из tunicodestring, и преобразование должно быть безопасным.