fwrite and MATLAB for a raid0 disk - Only one lane?

조회 수: 2(최근 30일)
Vincent Perrot
Vincent Perrot 2022년 3월 28일
편집: Vincent Perrot 2022년 3월 30일
Hello everyone,
I have a raid0 NVMe disk (made up of 4 NVMe disks connected together through a PCIe card adaptator).
The disk works great (up to 12GB/s OUTSIDE MATLAB, PCIe 3.0) but I cannot reach such speed in MATLAB.
It looks like MATLAB is using a single bus lane (aka 3.5GB/s) to write the data to the disk (simple example):
data = randn(1024, 1024, 1024, 'double'); %8 GB
fid = fopen('test.bin', 'W');
fwrite(fid, data(:), 'double');
Takes about 2.3 seconds which is about 3.5 GB/s so like using one lane... where the raid0 uses 4 lanes (4x4 PCIe).
I am running out of solution, this is not related to the disk/raid0 itself; I tested a lot of raid0 configuration (bios, VROC, Windows raid), the issue only occur in MATLAB. Using hd5f files does not solve that issue, it seems to be related to MATLAB itself.
FYI: I need such speed, in my field/lab we are creating about 1TB data per 5 min the bottleneck is always related to saving the data.
EDIT 1: Removed "b" argument from "fopen"
EDIT 2: Added type "double" to "fwrite"
Thank you a lot.
  댓글 수: 5
Vincent Perrot
Vincent Perrot 2022년 3월 30일
@Walter Roberson I did a MEX file using WriteFile without success. I will try some asynchronous writes with WriteFileEx and also try WriteFileGather.
I did contact the support to get some answers about that.
I tried fwrite/ofstream/WriteFile (MEX files) even in chuncks, without any success.
Thanks for taking the time, I will read those links and try those approaches.

댓글을 달려면 로그인하십시오.


Jan 2022년 3월 29일
편집: Jan 2022년 3월 29일
What about trying it as C-Mex?
data = randn(1024, 1024, 1024, 'double'); %8 GB
// Short hack, UNTESTED!!!
// uglyCWrite.c
#include "mex.h"
#include <stdio.h>
#include <stdlib.h>
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
double *data;
size_t n, w;
File *fid;
data = (double *) mxGetData(prhs[0]);
n = mxGetNumberOfElements(prhs[0]);
w = mxGetElementSize(prhs[0]);
fid = fopen("test.bin", "w");
fwrite(data, n, w, fid);
  댓글 수: 2

댓글을 달려면 로그인하십시오.

Jeremy Hughes
Jeremy Hughes 2022년 3월 29일
I was playing around with this and found that this is much faster (by a factor of 3 on my machine):
  댓글 수: 1
Vincent Perrot
Vincent Perrot 2022년 3월 29일
편집: Vincent Perrot 2022년 3월 29일
Thank you.
Sadly we tried it, this is how I got the 3.5GB/s I was talking about in my first message.
I played around with the code and forgot to put it back in my question, sorry about that.
I edited my question, we are still at 3.5GB/s instead of 12 GB/s ish.

댓글을 달려면 로그인하십시오.


Find more on Large Files and Big Data in Help Center and File Exchange




Community Treasure Hunt

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

Start Hunting!

Translated by