Datastore и работа с большими данными на matlab - PullRequest
0 голосов
/ 16 ноября 2018

У меня большой набор данных размером в 23 ГБ по тиковым биржевым данным без названий переменных в качестве заголовка и без разделителей.Пожалуйста, смотрите изображение, чтобы получить представление о моем наборе данных.

Данные должны быть разбиты на столбцы с именами переменных, а длина указывается следующим образом:

  • Переменная 1: Mkt, длина:2 байта
  • Переменная 2: сегмент, длина: 4 байта
  • Переменная 3: номер заказа, длина: 16 байтов
  • Переменная 4: время, длина: 14 байтов
  • Переменная 5: BSI, длина: 1 байт
  • Переменная 6: активность, длина: 1 байт
  • Переменная 7: символ, длина: 10 байт
  • Переменная 8: Серия, длина: 2 байта
  • Переменная 9: Объем, длина: 8 байтов
  • Переменная 10: VolOrg, длина: 8 байтов
  • Переменная 11: Ltp, длина:8 байтов
  • Переменная 12: Tp, длина: 8 байтов
  • Переменная 13: MOF, длина: 1 байт
  • Переменная 14: DD, длина: 1 байт
  • Переменная 15: FEM, длина: 1 байт
  • Переменная 16: Ind, длина: 1 байт
  • Переменная 17: Ins, длина: 1 байт

Как я могу разбить один столбец на вышеупомянутый нюmber указанных столбцов и обработка в Matlab Datastore для извлечения некоторой необходимой информации?Пока я не могу найти никаких ресурсов.

Это скриншот команды предварительного просмотра хранилища данных Matlab: screenshot of Matlab datastore preview command

1 Ответ

0 голосов
/ 16 ноября 2018

Вам понадобится пользовательская функция для чтения текстовых файлов с разделителями столбцов.Есть много вариантов сделать это, некоторые намного эффективнее других.Насколько я экспериментировал, sscanf - наиболее эффективная функция для преобразования больших объемов текста в числовые значения, хотя она требует, чтобы значения были разделены пробелами (что требует некоторых выделений и отступов).Следующий код должен работать нормально и настолько быстро, насколько это возможно, без переписывания некоторых частей кода на языке C.

function data=customRead(filename)

%% Define the file format there %%
format = {'Mkt',     [1 2],  'str';...
          'Seg',     [3 6],  'str';...
          'OrderNo', [7 22], 'int64';...  %(64 bit because int32 has 9 digits max)
          'Time',    [23 36], 'int64';...
          'BSI',     [37 37], 'int'}; %The same goes on for other fields

%% Load the file content in memory %%
fid=fopen(filename,'r');
allData=fread(fid,Inf,'*uint8');
fclose(fid);

%% Make it an array, with one line from the dat file in each row %%
bytesPerLine = 87; % 86 bytes + 1 newline (or is it 2 for \r\n ?)
nLines = length(allData)/bytesPerLine;
allData=char(reshape(allData,[bytesPerLine,nLines])'); %Each line of the input is now stored in a row

%% Loop over format fields and populate the output structure
for ii=1:size(format,2)
   thisData= allData(format{ii,2},:); %select range from char array
   switch format{ii,3}
       case 'str'
           % cast to string
           data.(format{ii,1})=string(thisData);
       case 'int'
           thisData = [thisData,repmat(' ',[nLines,1])]'; %pad with a space after each value and transpose
           thisData = thisData(:); %make it a vector
           data.(format{ii,1})=int32(sscanf(thisData,'%d')); %read with sscanf (this is fast)
       case 'int64'
           thisData = [thisData,repmat(' ',[nLines,1])]';
           thisData = thisData(:)';
           data.(format{ii,1})=sscanf(thisData,'%li'); % %li to read as int64 
       otherwise
           error('%s : unknown format %s',format{ii,1},format{ii,3});
       end
   end
end

В результате получается структура, каждое поле которой представляет собой вектор-столбец string , int32 или int64

Затем можно определить хранилище данных с помощью пользовательской функции:

store = fileDatastore(location,'ReadFcn',@customRead);
...