Need help! Не решается задача, упираюсь в ограничения железа - страница 20

 

komposter, вы можете использовать в своём советнике DLL?

Если, да, то можно сделать следующее:

запаковать данные в файл с заголовочной таблицей, используя ZLIB

(http://www.zlib.net/

Будет работать очень быстро(вы просто удивитесь на сколько быстро.

Готовность к работе DLL - 3 мс. Всё будет работать в "реальном времени").

Данные сократятся в 5-8 раз и в конце этого же файла(запакованного)

будет храниться таблица с ID, оффсетами и длиной данных. 

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

подтаблицу( несколько подтаблиц), с указанем оффсетов в основную таблицу, чтобы

не перебирать всю таблицу, а только её небольшую часть. 

Например: Данные о USD храняться с 0 оффсета по 1023,

Данные по EU с 1024 по 2047 и т.д 

Если данные не запакуются в один файл(будет большим), то будет

ещё одна (малюсенькая) подтаблица, в которой запаковщик укажет номер файла.

А когда DLL загрузит файлы, она создаст общую подтаблицу из подтаблиц

всех файлов. А ещё лучше все оффсеты хранить в первом файле, и если

мы "выходим" за прелелы 1 файла, то данные берутся из второго и т.д 


 

 

Забыл..

Если вы воспользуетесь моим советом, то рекомендую запаковывать ваши

текстовые данные с помощью Zlib функции запаковки строк(не бинарных данных, так быстрее работает). 

Кажется эта функция называется ZCompressString...

zlib Home Site
  • www.zlib.net
Web page copyright © 1996-2014 Greg Roelofs, Jean-loup Gailly and Mark Adler. zlib software copyright © 1995-2012 Jean-loup Gailly and Mark Adler.
 

Зиповать, как и шифровать можно уже штатно:


Методы шифрования данных


Для указания метода преобразования данных (шифрование и расчет хешей) в функциях CryptEncode() и CryptDecode() используется перечисление ENUM_CRYPT_METHOD.

ENUM_CRYPT_METHOD

Константа

Описание

CRYPT_BASE64

Шифрование BASE64 (перекодировка)

CRYPT_AES128

Шифрование AES с ключом 128 бит (16 байт)

CRYPT_AES256

Шифрование AES с ключом 256 бит (32 байта)

CRYPT_DES

Шифрование DES с ключом 56 бит (7 байт)

CRYPT_HASH_SHA1

Расчёт HASH SHA1

CRYPT_HASH_SHA256

Расчёт HASH SHA256

CRYPT_HASH_MD5

Расчёт HASH MD5

CRYPT_ARCH_ZIP

ZIP архивирование

Документация по MQL5: Общие функции / CryptDecode
Документация по MQL5: Общие функции / CryptDecode
  • www.mql5.com
Общие функции / CryptDecode - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Renat:

Зиповать, как и шифровать можно уже штатно:


Методы шифрования данных


Для указания метода преобразования данных (шифрование и расчет хешей) в функциях CryptEncode() и CryptDecode() используется перечисление ENUM_CRYPT_METHOD.

ENUM_CRYPT_METHOD

Константа

Описание

CRYPT_BASE64

Шифрование BASE64 (перекодировка)

CRYPT_AES128

Шифрование AES с ключом 128 бит (16 байт)

CRYPT_AES256

Шифрование AES с ключом 256 бит (32 байта)

CRYPT_DES

Шифрование DES с ключом 56 бит (7 байт)

CRYPT_HASH_SHA1

Расчёт HASH SHA1

CRYPT_HASH_SHA256

Расчёт HASH SHA256

CRYPT_HASH_MD5

Расчёт HASH MD5

CRYPT_ARCH_ZIP

ZIP архивирование

 

Вопрос у топикстартера не о шифровании, а о способе быстрого доступа к данным.

Запаковка служит для сокращения объёма данных и быстрого перемещения по оффсетам

не основного (20Гб) файла, а в 5-8 раз сокращённого.

Только запаковать мало, нужно ещё иметь механизм быстрого доступа к данным

P/S В Zlib есть функции быстрой компресии и декомпресии строк. 

 

Я указал, что больше не нужно иметь сторонние длл для упаковки или шифрации данных. В противовес вашему способу с DLL.

О решении проблемы топикстартера не говорил.

 
Renat:

Я указал, что больше не нужно иметь сторонние длл для упаковки или шифрации данных. В противовес вашему способу с DLL.

О решении проблемы топикстартера не говорил.

DLL не запаковшик - распаковщик данных, а механизм быстрого извлечения данных из

файла, запакованного по определённой схеме. 

 
Так вот все это теперь легко делается средствами языка. Сжатие штатно доступно.
 
Renat:
Так вот все это теперь легко делается средствами языка. Сжатие штатно доступно.

Отлично, теперь топикстартер, наверное, решит свою проблему.

Я никогда не работал с файлами в MQL5, щас почитаю, возможно ли открыть

файл как поток, чтобы можно было использовать оффсеты.  

 

Да, получится :)

bool  FileSeek(
   int                  file_handle,     // handle файла
   long                 offset,          // в байтах
   ENUM_FILE_POSITION   origin           // позиция для отсчета
   );
Будем надеятся, что терминал работает так же быстро, как и нативная DLL
 
Все работает и быстро. Я выше описал методы повышения эффективности файловых операций в нашей реализации.
 
Renat:
Все работает и быстро. Я выше описал методы повышения эффективности файловых операций в нашей реализации.

Я не занижаю способности и возможности терминала, но

когда пару лет назад мне понадобилось извлекать данные из файла 1,21Гб, с 21 345 728(!) строк,

http://ftp.micex.com/pub/info/historical_data/Securities_market/OrderBook20130206.rar 

данные вида:

NO,SECCODE,BUYSELL,TIME,ORDERNO,ACTION,PRICE,VOLUME,TRADENO,TRADEPRICE

21345728,USD000UTSTOM,B,235000002,3568,0,29.6095,300000,,

То по указанному мной методу, время поиска составляло 35-45 МИКРОСЕКУНД,

правда сказать, что подготавливался файл более 2 суток :(  

P/S Дело не в том, что использовать (терминал или DLL), а в том, как подготовить данные. 

А то, что появились новые возможности в терминале, - это очень приветствуется! 

 
Mikalas:

Я не занижаю способности терминала, но

когда пару лет назад мне понадобилось извлекать данные из файла 1,21Гб, с 21 345 728(!) строк,

http://ftp.micex.com/pub/info/historical_data/Securities_market/OrderBook20130206.rar 

данные вида:

NO,SECCODE,BUYSELL,TIME,ORDERNO,ACTION,PRICE,VOLUME,TRADENO,TRADEPRICE

21345728,USD000UTSTOM,B,235000002,3568,0,29.6095,300000,,

То по указанному мной методу, время поиска составляло 35-45 МИКРОСЕКУНД,

правда сказать, что подготавливался файл более 2 суток :(  

Может быть миллисекунд? На Windows-based ОС в микросекундах измерения просто не осуществить...