Быстрое чтение файла (формат stream_lf) - PullRequest
1 голос
/ 13 декабря 2011

Ищите способ ускорить чтение и обработку большого текстового файла (в основном csv; stream_lf).

Должен ли я обойти RMS? Решение может быть асинхронным или синхронным.

Текущая реализация является синхронной, но слишком медленной.

Реализация в HP Pascal и использование библиотеки времени выполнения паскаля (OPEN / READLN / EOF / CLOSE). Обход библиотеки времени исполнения паскаля приемлем.

Примеры могут быть на С или Паскале.

Ответы [ 4 ]

3 голосов
/ 10 октября 2012

Для последовательных файлов: взгляните на код WASD или VWCMS (посмотрите на http://www.vsm.co.au/wasd).. Я знаю, что эти обходные RMS и в пользу скорости для веб-сервисов, но я не знаю, в каких источниках этосделано для относительных файлов, примите во внимание последовательность. Записи могут быть не exixtant (пусто?) Для индексированных файлов: НЕ. Используйте RMS вместо, из-за внутренней структуры (индексы переплетаются с данными в этих файлах.новый / переорганизованный файл, это нормально, но отсутствие обслуживания вызовет проблемы с доступом за пределами RMS)

1 голос
/ 14 декабря 2011

Для системного блока было установлено значение 32. Я попробовал SET RMS / BLOCK = 32 / BUF = 8.Это уже дало улучшение.

[править: Если нет настройки процесса, то используются системные настройки, которые мы использовали.Таким образом, тест завершил добавление буферов, но не увеличил их]

32 - это всего 16 КБ.Отлично подходит для 1992 года, хромает для 2012 года. Если больше буферов уже помогло, то большие буферы, вероятно, помогут еще больше.Чем больше, тем лучше.Множество 8 КБ может помочь только дополнительно.Таким образом, попробуйте 128, а также попробуйте 255 на уровне процесса SET RMS.Если это приносит счастье, тогда вы можете захотеть адаптировать процесс для выбора своих собственных настроек RMS и не полагаться на настройки DCL.

Обычно вызов RMS $ GET получает только одну запись, но вы можете «лгать»'о файле, с помощью SET FIL / ATTR = (RFM = UDF) или, возможно, (RFM = FIX, LRL = 8192).Вы можете сделать это временно в программе, используя SYS $ MODIFY.После этого вы можете читать большими кусками, но ваша программа должна будет декодировать реальные записи в поддельных записях.Это будет очень похоже на использование SYS $ READ / SYS $ QIOW (BlockIO), но переход в режим записи даст вам бесплатное «чтение вперед».Да, вы можете кодировать это самостоятельно с помощью Aysnc IO, но это хлопотно.

Кстати ... не сходите с ума от количества буферов.В тестах (много лет назад) я видел небольшие или отрицательные преимущества с более чем 10 или около того.Причина в том, что RMS «читает вперед», а не «держит вперед».Он заполняет все буферы асинхронно, но затем не отправляет дополнительное чтение, так как буферы обрабатываются.Только после того, как все данные будут использованы, будет перераспределять ввод-вывод для всех буферов, вместо того, чтобы пытаться идти вперед по мере обработки буферов.Эти «волны» ввода-вывода могут запутать подсистему хранения, и первый ввод-вывод в волне может быть замедлен остальной частью волны ... так что программа ждет.

Сколько данных находится в игре?десятки мегабайт или гигабайт> Будет ли изменение в кэше XFC для его кэширования между экспортом и обработкой?

Met vriendelijke groetjes.Хайн.

1 голос
/ 14 декабря 2011

Используйте C. Обход RMS.

fopen файл.

fseek до конца.

ftell , чтобы получить размер файла

malloc кусок памяти такого размера

fread это за один раз.

Кто-то может заподозрить, что если ваш файл намного больше вашего рабочего набора, то подкачка может быть тем, что съедает ваши настенные часы.

1 голос
/ 13 декабря 2011

Хм, здесь не так много конкретики.

Знаете ли вы, что RMS замедляет вас?

Сравните время обработки (IO, CPU, Elapsed) сSEARCH / STAT / WIN = 0 Одной индикацией может быть низкий режим USER, высокий EXEC больше, высокий IDLE.Использование MONI MODE или GETJPI с EXECTIM, USERTIM

Оптимальное RMS-считывание через PASRTL или напрямую, вероятно, будет означать несколько больших буферов с упреждающим чтением, без совместного использования или совместного использования только для чтения.

Повторпопробуйте после: $ SET / RMS / BLO = 127 / BUF = 8!$!Блок = 255 или 128 для последних версий OpenVMS (8.4 или 8.3 + исправления)

Если есть много небольших записей, и режим EXEC высок, тогда может быть слишком много времени для входа и выхода из RMS дляизвлечь записи.В этом случае попробуйте C или COBOL, чтобы прочитать файл без общего доступа.RTL (библиотека времени выполнения) для обоих будет использовать BLOCKIO, а не записывать ввод-вывод, чтобы избежать накладных расходов RMS.Они все еще соблюдают настройки буфера RMS, упомянутые выше.Попробуйте?

Удачи и ... дайте нам знать, как вы разбираетесь?Возможно, некоторые цифры до / после.

Приветствия, Хейн

...