InputB vs. Get;кодовые страницы;медленное чтение на Unix-сервере - PullRequest
1 голос
/ 23 июня 2010

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

Open FileName For Binary As nFileUnit
sContents = StrConv(InputB(LOF(nFileUnit), nFileUnit), vbUnicode)

Однако мы обнаружили, что это ОЧЕНЬ медленное чтение файла с сервера под управлением unix / linux, особенно когда владение файлом не совпадает с процессом, выполняющим чтение.

Я переписал вышеизложенное с помощью Get и обнаружил, что это намного быстрее и не страдает от каких-либо проблем с владением файлами. Я ценю, что это может быть решено путем перенастройки сервера каким-либо образом, но я думаю, что после обнаружения даже без этой проблемы метод Get все еще намного быстрее, чем InputB. Я бы хотел заменить свой существующий код с помощью Get.

Интересно, мог бы кто-нибудь сказать мне, действительно ли это сделает то же самое? В частности, правильно ли выполняется преобразование ANSI в Unicode и будет ли это всегда так. Мои тесты показывают, что следующий код замены делает то же самое, но быстрее:

  Open FileName For Binary As nFileUnit
  sContents = String(LOF(nFileUnit), " ")
  Get #nFileUnit, , sContents

Я также понимаю, что могу использовать байтовый массив, но опять же мои тесты показывают, что вышеприведенное проще и работает Итак, как работает буфер правильно (если вы считаете, что онлайн-справка по Get it сообщает о возвращенных символах - очевидно, это вызовет проблемы при чтении файла ANSI, написанного на кодовой странице китайского языка с двухбайтовыми китайскими символами в нем).

Следующее может представлять интерес, поскольку подход InputB обычно задается как метод для чтения полного файла, но он намного медленнее, примеры

Чтение 380 Кб файла по сети с сервера Unix

Ввод B (файл принадлежит) = 0,875 с

Ввод B (не принадлежит) = 72,8 с

Получить (либо) = 0,0156 с

Чтение файла 9Mb по сети с сервера Unix

Ввод B (файл принадлежит) = 19,65 с

Получить (либо) = 0,42 с

Спасибо Jonathan

1 Ответ

0 голосов
/ 26 июня 2010

InputB () - это CVar (InputB $ ()), и известно, что он ужасно медленный.Я подозреваю, что InputB $ () считывает байты и преобразует их в Unicode, используя текущую кодовую страницу с помощью некоторой стандартной логики для чтения текста с диска, а затем выполняет другое преобразование back в ANSI с использованием текущей кодовой страницы.

Возможно, вы далеко ушли, чтобы использовать ADODB.Stream.LoadFromFile () для загрузки полных текстовых файлов ANSI.Вы можете установить .Type = adTypeText и .Charset = соответствующую кодировку ANSI, как требуется для чтения из него Unicode через .ReadText (x), где x может быть числом байтов, или adReadAll или adReadLine.Для чтения строки вы можете установить .LineSeparator в adCR, adCRLF или adLF, как требуется.

Поддерживаются многие значения Charset: KOI8 для кириллицы, Big5 для китайского языка и т. Д.

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