大規模なデータセットを操作する(スクリプト)こんにちは、
大規模なGC-MSデータセット(4800万行)を操作したいのですが、データ操作の中間ステップで行き詰まります。
ここに添付されている中間テーブルNum-Example.jmpから、スクリプトを使用して新しいテーブルを作成したいと思います(これは、34万行の中間テーブルの14行のサブセットです=条件は4800万の最終テーブルにつながるはずです行=条件とデータ)。
このサブセットでは、2119行(これはNum-Example.jmpのCumulative [A]列の行14に対応)を含む新しいテーブルを自動的に(スクリプトを介して)作成する必要があります。列 ":ID#"にはID#=最初の131行で「1」、次の150行でID#="2"というように続きます。
ID#= "1"および131は、Num-Example.jmpの行1の情報から取得されます(ID#の列 "ID#"および新しいテーブルに作成する行数の列 ":A")。
ID#= "2"および150は、Num-Example.jmpの行2の情報に由来します。
以下同様に、最後の行= 14(ID#= 14)まで。
ご協力ありがとうございました。
エマニュエル
Re:大きなデータセットを操作する(スクリプト)データセットのサイズを考えると、最後までデータテーブルに何も入れないようにします。 行列でできる限り作業します。 このようなものが機能する可能性があります:
Names Default to Here(1);
mainTbl = Current Data Table();
idCol = Column(mainTbl,"A");
idNumCol = Column(mainTbl,"ID#");
ids = idCol << Get Values;
idNums = idNumCol << Get Values;
firstVals = [1] |/ (Cumulative Sum(ids)+1)[1::(N Row(ids)-1)];
lastVals = Cumulative Sum(ids);
idMat = J(Sum(ids),1,0);
For Each({idVal,i},ids,
idMat[firstVals[i]::lastVals[i]] = Repeat(idNums[i],idVal)
);
Re:大きなデータセットを操作する(スクリプト)これは、データテーブルを使用する場合にのみうまく機能するようです
names default to here(1);
dt=current data table();
ca=column(dt,"A");
cid=column(dt,"id#");
rowranges=column(dt,"Cumulative [A]")<< get values;
rowranges=[0] |/ rowranges;
dtnew=new table();
cidnew=dtnew << new column("id#");
for(ii=1, ii<=n rows(dt), ii++,
dtnew << add rows(ca[ii], at end);
cidnew[rowranges[ii]::rowranges[ii+1] ]=cid[ii];
);Re:大きなデータセットを操作する(スクリプト)このアプローチには注意が必要です。 入力テーブルが小さくない限り、非常に遅くなります。1000行と10,000行の入力テーブルを使用した2つのアプローチを簡単に見てみました。 速度の差はそれぞれ約4倍と約12倍でした(1,000の場合は0.6958秒対0.1722秒、10,000の場合は6.64秒対0.543秒)
興味深いのは、テーブルの行を事前に割り当ててから、テーブルに直接書き込むことです。 それでは、大きな違いはありますか?
Re: 大きなデータセットを操作する (スクリプト)こんにちは、ドンとサムの両方に感謝します。 2つのソリューションは機能しますが、ドンが言ったように、私の大規模なデータセットでは行列の使用の方が高速です。 エマニュエル