概要:数日間の研究の後、私はベクトルをファイルに/から読み書きするための高速かつ効率的な方法を見つけることができませんでした。私が見てきた答えの大部分は、個々の要素をファイルの内外にプッシュ/ポップすることです。要素の数が増えると、これは非常に時間がかかります。また、私はのの問題に答える試みを見つけることができませんでした。だから、あなたの解決策が私のの特定のの状況(すなわち、のの質問全体を読む)で動くことを確認してください。ベクターをファイルに読み書きする効率的な方法
問題:イメージに関するピクセル情報を含む非常に大きなデータ構造があります。それぞれ784ピクセルの60,000枚の画像があります。各画像は、手書き数字の画像である。したがって、60,000 * 784ピクセルに加えて、ラベルを含める必要があるので、イメージが表す桁を知る必要があります。私が使用しているラベルは、プロジェクト全体の範囲で見ているときに必要なもので、0,1,2、... 9を表す10の可能性のベクトルです。そのうちの1つに '1'/' true '、残りは' 0 '/' false 'です。さらに、このデータ構造は、プロジェクトの残りの部分で線形代数要件が必要なため、アルマジロ線形代数ライブラリで利用される 'Col'構造で情報を格納する必要があります。ですから、ファイルを保存/読み込みする構造はstd::vector<std::vector<arma::Col<double>>>
と宣言されています。ここで
は、私は、コンテキストを与えるために、今のデータを保存するために使用しています関数です。
void SaveTrainingData(vector<vector<Col<double>>> trainingData) //format: trainingData[60000][2][784, 10]
{
ofstream ofile("VectorizedTrainingData.dat", ios::binary);
for (int i = 0; i < trainingData.size(); i++)
for (int j = 0; j < trainingData[i].size(); j++)
for (int k = 0; k < trainingData[i][j].size(); k++)
ofile.write((char *)&trainingData[i][j][k], sizeof(double));
}
ご質問がありましたら、お気軽にお問い合わせ下さい!前もって感謝します。
'void SaveTrainingData(vector >> trainingData)'ベクトルを値渡ししなかった場合、関数呼び出しだけではスピードアップする可能性があります。また、最適化が有効になっているか、最適化されていないバージョンのプログラムを "デバッグ"して実行していますか?また、ディスクI/Oは、いくつかの点で最適化するのは難しいことですが、ディスクのパフォーマンスには多くの問題があります。 –
PaulMcKenzie