2015-09-10 2 views
0

Хорошо, поэтому нам нужно сохранить список слов и их соответствующую позицию в гораздо большем тексте. Нас спросили, эффективнее ли сохранить позицию, представленную в виде текста или представленную как биты (потоки данных в Java).Сочетание текстовой и битовой информации в файле на Java?

Я считаю, что поразрядное представление лучше всего, так как текст «1024» занимает 4 * 8 = 32 бита, а только 11, если они представлены как биты.

Следующий вопрос заключается в том, должен ли индекс быть сохранен в одном или двух файлах. Здесь я подумал: «Может быть, вы не можете комбинировать текст и побитовое представление в одном файле?» и по этой причине вам нужны два файла?

Итак, вопрос в первую очередь заключается в хранении текстовой информации (слова) в сочетании с побитовой информацией (ее положением) в одном файле?

ответ

-1

Число 1024 должно занимать, по меньшей мере, 2-4 байта (например, 16-32 бит), так как вам нужно знать, где заканчивается номер и где он начинается, и поэтому он должен иметь фиксированный размер. Если ваши позиции очень большие, например 124058936, вам нужно будет использовать 4 байта на числа (что было бы лучше, чем 9 байтов в виде строкового представления).

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

byte[] arr = new byte[in.readByte()]; // in.readByte()*2 if the string is encoded in 16 bits 
in.read(arr); // in is a FileInputStream/RandomAccessFile 
String yourString = new String(arr, "US-ASCII"); 

Другой Possiblity будет завершение вашей строки с нулевым символом (00), но вам нужно будет создать ваша собственная реализация для этого, поскольку ни один из читателей не поддерживает ее по умолчанию (AFAIK).

Теперь, действительно ли стоит хранить его в виде двоичных данных? Это действительно зависит от того, насколько велики ваши позиции (потому что строки, если в текстовой версии отделены от их позиции пробелом, занимают одинаковое количество байтов). Моя рекомендация заключается в том, что вы используете текстовую версию, так как, вероятно, будет легче разобрать и прочитать.

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

+0

Как вы вычисляете числа? Я думал, что в строковом представлении каждое число составляет один символ = один байт? Если я сохраняю его как биты, то, например, 1024 = 10000000000 = 11 бит? Хотя в тексте 1024 = 4 * 8 = 32? – MrJalapeno

+0

11 бит, но, как я уже сказал, вам нужен способ узнать, где начинается число и где оно заканчивается. Это делается с фиксированным размером, обычно 2 или 4 байта. Строковое представление - один байт на символ, да. – Emd4600

+0

Игнорирование возвращаемого значения 'InputStream.read' запрашивает проблемы. – VGR

0

Слишком смутно с точки зрения того, что действительно необходимо.

Если у вас есть до нескольких миллионов слов + позиции, не задумывайтесь об этом. Хранить в любом формате проще всего; пространство было бы проблемой только в том случае, если вам необходимо отправить данные по сети с низкой пропускной способностью.

Тогда доступно общее сжатие данных, просто обернув ваши входы/выходные потоки с помощью deflater или gzip (уже встроенного JRE), вы получите достаточно хорошее сжатие (50% и более для текста). Это легко удаляет то, что вы можете быстро напишите сами. Если вам нужно лучшее сжатие, XZ для java (реализует сжатие LZMA), с открытым исходным кодом.

Если вам нужен произвольный доступ, вы на неправильном пути, вам нужно тщательно спроектировать макет данных для шаблонов доступа, и хранение должно быть только третичным.

Смежные вопросы