Строка в байт [delphi] - PullRequest
       4

Строка в байт [delphi]

3 голосов
/ 31 декабря 2010

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

Ответы [ 3 ]

5 голосов
/ 31 декабря 2010

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

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 или событие a просто Двоичное дерево . Они могут работать непосредственно с жесткого диска и могут быть очень быстрыми для поиска. Если вы затем кешируете подмножество данных в ОЗУ, вы получаете оптимальное решение памяти в зависимости от скорости.

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

1 голос
/ 31 декабря 2010

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

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

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

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

0 голосов
/ 01 января 2011

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

...