データストア(tab​ularTextDa​tastore)の仕​様(readメソッド​の限界値?)

matlab 2018aを使用しています。
データストア(tabularTextDatastore)を使用してCSVファイルの読込み処理を作成しました。
NumHeaderLinesとReadSizeを指定し、特定の位置から720000行のデータを読み込む
処理を作成しました。しかし、readメソッドでデータを読み込んだところ690000行ぐらいしか読み込むことが
できませんでした。readメソッドで読み込めるデータの数には限界があるのでしょうか

 Accepted Answer

Kazuya
Kazuya on 5 Dec 2018
Edited: Kazuya on 5 Dec 2018
read メソッドで読み取るデータの数に上限がある、、仕様ではないと思いますが何が原因なんでしょうね。もしメモリに収まらなくて読み込みを途中でやめている・・なんて機能が動いていれば
memory
関数を実行してみて、MATLABが使用できるメモリの量を確認してみるとヒントになるかもしれません。
ちなみに readall メソッドだとどうなりますか?

3 Comments

32GB搭載のパソコンを使用しているためメモリ量は十分だと思います。
memoryで確認したところMATLABが使用できるメモリは26GByteぐらいでした。
ちなみにReadSizeは696624までが限界でした。それより大きい値を指定しても
696624行しか読み込めませんでした。
また、readallだと全てのレコード(700000行)を読み込めるようです。
ただ、対象のCSVファイルの700001行目以降にはゴミデータが付いているため
ReadSizeで読み込む数を指定し、readメソッドで読み取りたいと考えています。
ReadSize で指定する数字は必ずその行数だけが読み取れるという仕様になっておらず、様々な要因で変化します。今回ご報告いただいたように数十万行を読み込む場合も多少ばらつくことが確認されておりますし、例えば 100 行数のデータを持つ csv ファイルを読み取る場合には、一度の read コマンドで読み取るデータ行数の上限は 100 となり、ファイルをまたいでの一度の読み取りは現時点(R2018b)では実行できません。ご要望は開発サイドに上げさせていただきました。
ご面倒ですが、下記の関数を read の代わりに使っていただければ、CursorSize で指定した数だけ読み込んだデータを返すことができますので、活用いただけますと幸いです。要求した行数を読み取るまで繰り返し read を実行する処理にしております。
function data = myread(ds, CursorSize)
%
% workaround for read method of datastore
% concatenate vertically until the height of data achieves to the required size, CursorSize
%
ds.ReadSize = CursorSize;
data = read(ds);
while height(data) < CursorSize
ImportedSize = height(data);
ds.ReadSize = CursorSize - ImportedSize;
try
adddata = read(ds);
data = vertcat(data,adddata); %#ok
catch ME
if ~strcmp(ME.identifier,'MATLAB:datastoreio:splittabledatastore:noMoreData');
errordlg('Data processing has been failed.');
end
return; % achieves the end of datastore
end
end
end % End-of-myre
御回答ありがとうございます。
ご提示いただいたコードで対応したいと思います。
ありがとうございました。

Sign in to comment.

More Answers (0)

Asked:

on 29 Nov 2018

Commented:

on 20 Dec 2018

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!