Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. How to write entire QVector to a binary file?

How to write entire QVector to a binary file?

Scheduled Pinned Locked Moved Unsolved General and Desktop
qvectorbinary formatqdatastream
46 Posts 8 Posters 12.8k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • V VRonin
    17 Nov 2020, 10:04

    @CJha said in How to write entire QVector to a binary file?:

    I have to read it in Matlab.

    If I remeber correctly Matlab reads csv (aka text) so QTextStream is what you want. something like:

    QFile file("BinTest.bin");
    file.open(QIODevice::WriteOnly | QIODevice::Text);
    QTextStream out(&file);
    QVector<double> vec;
    for(int ii = 0; ii < 10; ++ii){
        vec << ii * 0.33;
    }
    for(auto&& val : vec)
    out << val << ',';
    file.close();
    
    C Offline
    C Offline
    CJha
    wrote on 17 Nov 2020, 10:10 last edited by
    #16

    @VRonin Yes, but writing a .csv file takes much longer than writing a binary file (almost 10 times more for large data sets). I have tried and tested it. I am gathering data at a much faster rate, up to 1 million doubles per second and I have to write it to a file continuously for hours, and this file will be analysed in Matlab by researchers. If I write 1 million data points in a .csv file it takes around 4 seconds while doing the same in a binary file takes around 400 milliseconds.

    J J J 3 Replies Last reply 17 Nov 2020, 10:10
    0
    • C CJha
      17 Nov 2020, 10:10

      @VRonin Yes, but writing a .csv file takes much longer than writing a binary file (almost 10 times more for large data sets). I have tried and tested it. I am gathering data at a much faster rate, up to 1 million doubles per second and I have to write it to a file continuously for hours, and this file will be analysed in Matlab by researchers. If I write 1 million data points in a .csv file it takes around 4 seconds while doing the same in a binary file takes around 400 milliseconds.

      J Offline
      J Offline
      JonB
      wrote on 17 Nov 2020, 10:10 last edited by
      #17

      @CJha
      OK, so STOP and tell us exactly what format MatLab will accept, and take it from there...

      1 Reply Last reply
      2
      • C CJha
        17 Nov 2020, 10:10

        @VRonin Yes, but writing a .csv file takes much longer than writing a binary file (almost 10 times more for large data sets). I have tried and tested it. I am gathering data at a much faster rate, up to 1 million doubles per second and I have to write it to a file continuously for hours, and this file will be analysed in Matlab by researchers. If I write 1 million data points in a .csv file it takes around 4 seconds while doing the same in a binary file takes around 400 milliseconds.

        J Offline
        J Offline
        jsulm
        Lifetime Qt Champion
        wrote on 17 Nov 2020, 10:11 last edited by
        #18

        @CJha But does Matlab support any binary format? You have to write in a format supported by Matlab.

        https://forum.qt.io/topic/113070/qt-code-of-conduct

        1 Reply Last reply
        0
        • C CJha
          17 Nov 2020, 10:10

          @VRonin Yes, but writing a .csv file takes much longer than writing a binary file (almost 10 times more for large data sets). I have tried and tested it. I am gathering data at a much faster rate, up to 1 million doubles per second and I have to write it to a file continuously for hours, and this file will be analysed in Matlab by researchers. If I write 1 million data points in a .csv file it takes around 4 seconds while doing the same in a binary file takes around 400 milliseconds.

          J Offline
          J Offline
          J.Hilk
          Moderators
          wrote on 17 Nov 2020, 10:13 last edited by
          #19

          @CJha said in How to write entire QVector to a binary file?:

          I am gathering data at a much faster rate, up to 1 million doubles per second and I have to write it to a file continuously for hours

          actually stop right here!

          if this program is used more than once, you're going to destroy your HD/SSD very quickly!

          I'm sure there's an other - in memory - way to hand over those data points


          Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


          Q: What's that?
          A: It's blue light.
          Q: What does it do?
          A: It turns blue.

          C 1 Reply Last reply 17 Nov 2020, 10:18
          1
          • C Offline
            C Offline
            CJha
            wrote on 17 Nov 2020, 10:14 last edited by
            #20

            @JonB @jsulm Matlab supports the binary format. There are functions such as fopen, fread, fseek etc. to read and write binary files. I have read binary file written using QDataStream in Matlab using fread and so on

            J 1 Reply Last reply 17 Nov 2020, 10:16
            0
            • C CJha
              17 Nov 2020, 10:14

              @JonB @jsulm Matlab supports the binary format. There are functions such as fopen, fread, fseek etc. to read and write binary files. I have read binary file written using QDataStream in Matlab using fread and so on

              J Offline
              J Offline
              jsulm
              Lifetime Qt Champion
              wrote on 17 Nov 2020, 10:16 last edited by
              #21

              @CJha said in How to write entire QVector to a binary file?:

              Matlab supports the binary format

              Do you have its specification?

              https://forum.qt.io/topic/113070/qt-code-of-conduct

              C 1 Reply Last reply 17 Nov 2020, 10:23
              0
              • J J.Hilk
                17 Nov 2020, 10:13

                @CJha said in How to write entire QVector to a binary file?:

                I am gathering data at a much faster rate, up to 1 million doubles per second and I have to write it to a file continuously for hours

                actually stop right here!

                if this program is used more than once, you're going to destroy your HD/SSD very quickly!

                I'm sure there's an other - in memory - way to hand over those data points

                C Offline
                C Offline
                CJha
                wrote on 17 Nov 2020, 10:18 last edited by
                #22

                @J-Hilk I am not sure what you mean by

                if this program is used more than once, you're going to destroy your HD/SSD very quickly!

                Given that 1 million doubles are 8 million bytes, I think modern processors and disk drives can handle such speed easily.

                J J 2 Replies Last reply 17 Nov 2020, 10:21
                0
                • C CJha
                  17 Nov 2020, 10:18

                  @J-Hilk I am not sure what you mean by

                  if this program is used more than once, you're going to destroy your HD/SSD very quickly!

                  Given that 1 million doubles are 8 million bytes, I think modern processors and disk drives can handle such speed easily.

                  J Offline
                  J Offline
                  JonB
                  wrote on 17 Nov 2020, 10:21 last edited by JonB
                  #23

                  @CJha
                  You may (well) know more than I, but can MatLab read and process 8MB of new data per second, at the same time as something else is producing it? And, separately, do you really generate 1 million new data points per second?

                  Also, as @J-Hilk said, wouldn't sending a pipe stream (e.g. a socket?) be better than writing to file and reading back? Does Matlab accept incoming data elsewhere than in a file?

                  C 1 Reply Last reply 17 Nov 2020, 10:28
                  0
                  • J jsulm
                    17 Nov 2020, 10:16

                    @CJha said in How to write entire QVector to a binary file?:

                    Matlab supports the binary format

                    Do you have its specification?

                    C Offline
                    C Offline
                    CJha
                    wrote on 17 Nov 2020, 10:23 last edited by
                    #24

                    @jsulm It is highly compatible. Here are the links for fopen, fread, fseek. I all these I can specify the format, ByteOrder, size of data (such as int, double, etc), and quite a few other things.
                    I don't think Matlab is the restrictive thing here, I can read any type of binary file in Matlab as long as I know how it is written.

                    J 1 Reply Last reply 17 Nov 2020, 10:26
                    0
                    • C CJha
                      17 Nov 2020, 10:23

                      @jsulm It is highly compatible. Here are the links for fopen, fread, fseek. I all these I can specify the format, ByteOrder, size of data (such as int, double, etc), and quite a few other things.
                      I don't think Matlab is the restrictive thing here, I can read any type of binary file in Matlab as long as I know how it is written.

                      J Offline
                      J Offline
                      JonB
                      wrote on 17 Nov 2020, 10:26 last edited by JonB
                      #25

                      @CJha
                      The code to write a QVector to file in the way you want, as fast as possible in one blob not one-by-one, is given in e.g. https://www.qtcentre.org/threads/65713-Output-a-QVector-of-doubles-to-a-binary-file-(without-using-QDatastream)?p=289540#post289540 :

                      qint64 bytesWritten = file.write(reinterpret_cast<const char*>(vec.constData()), sizeof(double) * vec.size());
                      

                      EDIT I think you will want reinterpret_cast<> rather than static_cast<> here as shown in that post, so I have altered the code line to use that.

                      C 1 Reply Last reply 17 Nov 2020, 10:30
                      4
                      • J JonB
                        17 Nov 2020, 10:21

                        @CJha
                        You may (well) know more than I, but can MatLab read and process 8MB of new data per second, at the same time as something else is producing it? And, separately, do you really generate 1 million new data points per second?

                        Also, as @J-Hilk said, wouldn't sending a pipe stream (e.g. a socket?) be better than writing to file and reading back? Does Matlab accept incoming data elsewhere than in a file?

                        C Offline
                        C Offline
                        CJha
                        wrote on 17 Nov 2020, 10:28 last edited by
                        #26

                        @JonB No, Matlab is going to read it at a later time. When data is being generated it is just stored in a binary file for later use by Matlab. And yes, Matlab is slower but it doesn't matter if it takes 1 second or 1 day to read the file as the researchers can just start loading the file in the night and come back in the morning to work on it (many researchers wait for times like 24 to 36 hours for files to get processed).

                        And yes, I am generating data at 1 million doubles per second. I am using National Instruments and Measurement Computing DAQ boards, controlling both through Qt and C++ and these boards are capable of generating 1 million doubles per second.

                        1 Reply Last reply
                        1
                        • C CJha
                          17 Nov 2020, 10:18

                          @J-Hilk I am not sure what you mean by

                          if this program is used more than once, you're going to destroy your HD/SSD very quickly!

                          Given that 1 million doubles are 8 million bytes, I think modern processors and disk drives can handle such speed easily.

                          J Offline
                          J Offline
                          J.Hilk
                          Moderators
                          wrote on 17 Nov 2020, 10:29 last edited by J.Hilk
                          #27

                          @CJha said in How to write entire QVector to a binary file?:

                          @J-Hilk I am not sure what you mean by

                          if this program is used more than once, you're going to destroy your HD/SSD very quickly!

                          Given that 1 million doubles are 8 million bytes, I think modern processors and disk drives can handle such speed easily.

                          its not about the speed, its about the amount of times written into the cell, Samsung for examples says their ssd's are "built to handle 150 terabytes written" with, lets say 1 million points of double (8 bytes each) per second would mean your ssd is done for in roughly 200 days, instead of the approximated 10 years.

                          also you have to coordinate read and write access of the file, so that Matlab and your Qt Programm to not try to access the file at the same time with potential data loss etc


                          Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


                          Q: What's that?
                          A: It's blue light.
                          Q: What does it do?
                          A: It turns blue.

                          C 1 Reply Last reply 17 Nov 2020, 10:43
                          2
                          • J JonB
                            17 Nov 2020, 10:26

                            @CJha
                            The code to write a QVector to file in the way you want, as fast as possible in one blob not one-by-one, is given in e.g. https://www.qtcentre.org/threads/65713-Output-a-QVector-of-doubles-to-a-binary-file-(without-using-QDatastream)?p=289540#post289540 :

                            qint64 bytesWritten = file.write(reinterpret_cast<const char*>(vec.constData()), sizeof(double) * vec.size());
                            

                            EDIT I think you will want reinterpret_cast<> rather than static_cast<> here as shown in that post, so I have altered the code line to use that.

                            C Offline
                            C Offline
                            CJha
                            wrote on 17 Nov 2020, 10:30 last edited by
                            #28

                            @JonB Thanks, this might just work for me. I will try it out now and see what's the difference in speed of writing using this method and iterative method and will post it back here.

                            1 Reply Last reply
                            1
                            • J J.Hilk
                              17 Nov 2020, 10:29

                              @CJha said in How to write entire QVector to a binary file?:

                              @J-Hilk I am not sure what you mean by

                              if this program is used more than once, you're going to destroy your HD/SSD very quickly!

                              Given that 1 million doubles are 8 million bytes, I think modern processors and disk drives can handle such speed easily.

                              its not about the speed, its about the amount of times written into the cell, Samsung for examples says their ssd's are "built to handle 150 terabytes written" with, lets say 1 million points of double (8 bytes each) per second would mean your ssd is done for in roughly 200 days, instead of the approximated 10 years.

                              also you have to coordinate read and write access of the file, so that Matlab and your Qt Programm to not try to access the file at the same time with potential data loss etc

                              C Offline
                              C Offline
                              CJha
                              wrote on 17 Nov 2020, 10:43 last edited by
                              #29

                              @J-Hilk That's a good point, but it's not the case for me as the data write and data read happens at different times. Also, SSD lifetime doesn't matter as these researchers have lots of funding and SSD is a cheap item for them. My job is to give them what they ask for, and if they ruin their SSD in 200 days that is up to them (of course I will tell them that it can ruin their SSD fast but that's all I can do).

                              J J 3 Replies Last reply 17 Nov 2020, 10:45
                              1
                              • C CJha
                                17 Nov 2020, 10:43

                                @J-Hilk That's a good point, but it's not the case for me as the data write and data read happens at different times. Also, SSD lifetime doesn't matter as these researchers have lots of funding and SSD is a cheap item for them. My job is to give them what they ask for, and if they ruin their SSD in 200 days that is up to them (of course I will tell them that it can ruin their SSD fast but that's all I can do).

                                J Offline
                                J Offline
                                J.Hilk
                                Moderators
                                wrote on 17 Nov 2020, 10:45 last edited by
                                #30

                                @CJha Fair enough,
                                The customer gets, what the customer wants.

                                I can't remember the amount of times I had to do implement stuff I whole heartily disagreed with ...🙈


                                Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


                                Q: What's that?
                                A: It's blue light.
                                Q: What does it do?
                                A: It turns blue.

                                1 Reply Last reply
                                1
                                • C CJha
                                  17 Nov 2020, 10:43

                                  @J-Hilk That's a good point, but it's not the case for me as the data write and data read happens at different times. Also, SSD lifetime doesn't matter as these researchers have lots of funding and SSD is a cheap item for them. My job is to give them what they ask for, and if they ruin their SSD in 200 days that is up to them (of course I will tell them that it can ruin their SSD fast but that's all I can do).

                                  J Offline
                                  J Offline
                                  JonB
                                  wrote on 17 Nov 2020, 10:49 last edited by
                                  #31

                                  @CJha said in How to write entire QVector to a binary file?:

                                  Also, SSD lifetime doesn't matter as these researchers have lots of funding and SSD is a cheap item for them.

                                  LOL :)

                                  1 Reply Last reply
                                  1
                                  • C CJha
                                    17 Nov 2020, 10:43

                                    @J-Hilk That's a good point, but it's not the case for me as the data write and data read happens at different times. Also, SSD lifetime doesn't matter as these researchers have lots of funding and SSD is a cheap item for them. My job is to give them what they ask for, and if they ruin their SSD in 200 days that is up to them (of course I will tell them that it can ruin their SSD fast but that's all I can do).

                                    J Offline
                                    J Offline
                                    JonB
                                    wrote on 17 Nov 2020, 10:55 last edited by JonB
                                    #32

                                    @CJha
                                    BTW. When you have gotten it working with that file.write(), which is going to be as good as it gets. Since speed seems to be such an issue, and you're going to be doing ~1,000,000 points, and you goal is going to be to access the data array and write it out raw. Then my thought would be: why use a Qt QVector<> at all? For best efficiency/memory usage, would this be a case where simply creating a C++ array of doubles of sufficient size and storing into that directly/writing out to file would be simpler than wrapping it in QVector<> overheads: even if that is small, what's the point?

                                    And P.S.
                                    If you stick with QVector<>, do make sure you use QVector::resize/reserve(int size) appropriately early (once if possible), I think. What you do not want is to have the QVector keep reallocating/moving existing data as your million points keep arriving....

                                    C 1 Reply Last reply 17 Nov 2020, 11:43
                                    2
                                    • J JonB
                                      17 Nov 2020, 10:55

                                      @CJha
                                      BTW. When you have gotten it working with that file.write(), which is going to be as good as it gets. Since speed seems to be such an issue, and you're going to be doing ~1,000,000 points, and you goal is going to be to access the data array and write it out raw. Then my thought would be: why use a Qt QVector<> at all? For best efficiency/memory usage, would this be a case where simply creating a C++ array of doubles of sufficient size and storing into that directly/writing out to file would be simpler than wrapping it in QVector<> overheads: even if that is small, what's the point?

                                      And P.S.
                                      If you stick with QVector<>, do make sure you use QVector::resize/reserve(int size) appropriately early (once if possible), I think. What you do not want is to have the QVector keep reallocating/moving existing data as your million points keep arriving....

                                      C Offline
                                      C Offline
                                      CJha
                                      wrote on 17 Nov 2020, 11:43 last edited by
                                      #33

                                      @JonB I agree that a simple C++ array would be faster and easier as that is the format in which data is generated in the buffer from the acquisition device.

                                      However, if I write the data to a file in the same thread (in the same callback function where the data is deposited in the buffer from the acquisition device or in a different function), then since writing takes a long time it blocks the entire thread, this (once in a while) blocks the callback function which is called each time the required number of data samples is generated by the acquisition device resulting in an error.

                                      To solve this problem, I write data to a binary file in a different thread. Now, if I pass the address of the same buffer in which data is deposited then it defeats the purpose of having multiple threads as I am accessing the same buffer in which data is deposited from the acquisition device just from a different thread instead of the main one. To overcome this I write the incoming data from the acquisition device's buffer to a QVector<double> then send this vector over a Qt::QueuedConnection to my "Writer" thread and I write it there. I am not so good with C++ arrays and so I am not quite confident on how to achieve this without involving QVector in the process. If you have any idea on how can I simplify this process I will be very grateful :)

                                      J J 2 Replies Last reply 17 Nov 2020, 11:44
                                      0
                                      • C CJha
                                        17 Nov 2020, 11:43

                                        @JonB I agree that a simple C++ array would be faster and easier as that is the format in which data is generated in the buffer from the acquisition device.

                                        However, if I write the data to a file in the same thread (in the same callback function where the data is deposited in the buffer from the acquisition device or in a different function), then since writing takes a long time it blocks the entire thread, this (once in a while) blocks the callback function which is called each time the required number of data samples is generated by the acquisition device resulting in an error.

                                        To solve this problem, I write data to a binary file in a different thread. Now, if I pass the address of the same buffer in which data is deposited then it defeats the purpose of having multiple threads as I am accessing the same buffer in which data is deposited from the acquisition device just from a different thread instead of the main one. To overcome this I write the incoming data from the acquisition device's buffer to a QVector<double> then send this vector over a Qt::QueuedConnection to my "Writer" thread and I write it there. I am not so good with C++ arrays and so I am not quite confident on how to achieve this without involving QVector in the process. If you have any idea on how can I simplify this process I will be very grateful :)

                                        J Offline
                                        J Offline
                                        jsulm
                                        Lifetime Qt Champion
                                        wrote on 17 Nov 2020, 11:44 last edited by
                                        #34

                                        @CJha said in How to write entire QVector to a binary file?:

                                        then since writing takes a long time it blocks the entire thread

                                        You could do double-buffering with two arrays :-)

                                        https://forum.qt.io/topic/113070/qt-code-of-conduct

                                        C 1 Reply Last reply 17 Nov 2020, 12:40
                                        1
                                        • C CJha
                                          17 Nov 2020, 11:43

                                          @JonB I agree that a simple C++ array would be faster and easier as that is the format in which data is generated in the buffer from the acquisition device.

                                          However, if I write the data to a file in the same thread (in the same callback function where the data is deposited in the buffer from the acquisition device or in a different function), then since writing takes a long time it blocks the entire thread, this (once in a while) blocks the callback function which is called each time the required number of data samples is generated by the acquisition device resulting in an error.

                                          To solve this problem, I write data to a binary file in a different thread. Now, if I pass the address of the same buffer in which data is deposited then it defeats the purpose of having multiple threads as I am accessing the same buffer in which data is deposited from the acquisition device just from a different thread instead of the main one. To overcome this I write the incoming data from the acquisition device's buffer to a QVector<double> then send this vector over a Qt::QueuedConnection to my "Writer" thread and I write it there. I am not so good with C++ arrays and so I am not quite confident on how to achieve this without involving QVector in the process. If you have any idea on how can I simplify this process I will be very grateful :)

                                          J Offline
                                          J Offline
                                          JonB
                                          wrote on 17 Nov 2020, 11:54 last edited by
                                          #35

                                          @CJha
                                          My simple answer would be: mutexes. How that compares to queued signals I do not know; I am not suggesting mutexes, only answering the question.

                                          QVector<double> then send this vector over a Qt::QueuedConnection

                                          Wouldn't mind just seeing how you send it, do you use const QVector<> &?

                                          C 1 Reply Last reply 17 Nov 2020, 12:55
                                          0

                                          25/46

                                          17 Nov 2020, 10:26

                                          • Login

                                          • Login or register to search.
                                          25 out of 46
                                          • First post
                                            25/46
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • Users
                                          • Groups
                                          • Search
                                          • Get Qt Extensions
                                          • Unsolved