Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Special Interest Groups
  3. C++ Gurus
  4. Fastest way to read part of 300 Gigabyte binary file

Fastest way to read part of 300 Gigabyte binary file

Scheduled Pinned Locked Moved Solved C++ Gurus
58 Posts 7 Posters 13.5k 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.
  • JonBJ JonB

    @Please_Help_me_D
    Yes, that would figure then! Meanwhile, I thought earlier on you were saying the file was on the network, that's a very different situation from a local SSD....

    Please_Help_me_DP Offline
    Please_Help_me_DP Offline
    Please_Help_me_D
    wrote on last edited by Please_Help_me_D
    #14

    @JonB maybe I do some confusing things :)
    My computer (laptop) has two devices to store data: SSD and HDD. Windows is installed on SSD. But neither of those two has enough free space to store 300 Gygabyte file. So if I do some manipulation with this file then I use external HDD disk (third device) :)
    Now I got an idea to check the speed to read this small data (115 Megabyte) if I copy it to an external HDD G:/raw_le.sgy. Here is the result:
    fread/fseek = 0.5 seconds
    QFile::map = 0.06 seconds (the only one that didn't change)
    std::ifstream/seekg = 0.6 seconds
    _read/_lseek = 0.4 seconds

    I have to notice that when external HDD is plugged-in then the timings is less stable. My laptop starts to work a little harder from time to time...
    But the interesting thing is that external HDD increase the time of all the methods except memory mapping. Of course I only read 0.18 Megabyte data of 115 Megabyte file and the effect that external HDD is adjusted via USB doesn't hurt much (is negligible) on the resulting timings and we can see that it doesn't depend whether such small data is on internal device or on external. But when dealing with big data file (300 Gygabite) I can suppose that it have the dominant role in timings. I can't check it now because I don't have enough space on laptop but I'm going to try with 13 or 27 Gygabite data right now :D that should be interesting, I need to prepare the space))

    JonBJ 1 Reply Last reply
    0
    • Please_Help_me_DP Please_Help_me_D

      @JonB maybe I do some confusing things :)
      My computer (laptop) has two devices to store data: SSD and HDD. Windows is installed on SSD. But neither of those two has enough free space to store 300 Gygabyte file. So if I do some manipulation with this file then I use external HDD disk (third device) :)
      Now I got an idea to check the speed to read this small data (115 Megabyte) if I copy it to an external HDD G:/raw_le.sgy. Here is the result:
      fread/fseek = 0.5 seconds
      QFile::map = 0.06 seconds (the only one that didn't change)
      std::ifstream/seekg = 0.6 seconds
      _read/_lseek = 0.4 seconds

      I have to notice that when external HDD is plugged-in then the timings is less stable. My laptop starts to work a little harder from time to time...
      But the interesting thing is that external HDD increase the time of all the methods except memory mapping. Of course I only read 0.18 Megabyte data of 115 Megabyte file and the effect that external HDD is adjusted via USB doesn't hurt much (is negligible) on the resulting timings and we can see that it doesn't depend whether such small data is on internal device or on external. But when dealing with big data file (300 Gygabite) I can suppose that it have the dominant role in timings. I can't check it now because I don't have enough space on laptop but I'm going to try with 13 or 27 Gygabite data right now :D that should be interesting, I need to prepare the space))

      JonBJ Online
      JonBJ Online
      JonB
      wrote on last edited by
      #15

      @Please_Help_me_D
      Especially with memory mapping, I would think caching could easily affect your test timings. You'd better be timing only from clean OS boot!

      I would also guess that memory mapping might suffer from size of file, as caching may be a factor. Testing it with a 100MB file (which can be easily memory cached) may not be representative of performance when the real file will be 300GB.

      Please_Help_me_DP 2 Replies Last reply
      1
      • JonBJ JonB

        @Please_Help_me_D
        Especially with memory mapping, I would think caching could easily affect your test timings. You'd better be timing only from clean OS boot!

        I would also guess that memory mapping might suffer from size of file, as caching may be a factor. Testing it with a 100MB file (which can be easily memory cached) may not be representative of performance when the real file will be 300GB.

        Please_Help_me_DP Offline
        Please_Help_me_DP Offline
        Please_Help_me_D
        wrote on last edited by
        #16

        @JonB said in Fastest way to read part of 300 Gigabyte binary file:

        I would also guess that memory mapping might suffer from size of file, as caching may be a factor. Testing it with a 100MB file (which can be easily memory cached) may not be representative of performance when the real file will be 300GB.

        Yes I that is maybe be true... I need to test it
        I will try to stop most of programs (anti-virus first of all) before launching my app.

        1 Reply Last reply
        0
        • JonBJ JonB

          @Please_Help_me_D
          Especially with memory mapping, I would think caching could easily affect your test timings. You'd better be timing only from clean OS boot!

          I would also guess that memory mapping might suffer from size of file, as caching may be a factor. Testing it with a 100MB file (which can be easily memory cached) may not be representative of performance when the real file will be 300GB.

          Please_Help_me_DP Offline
          Please_Help_me_DP Offline
          Please_Help_me_D
          wrote on last edited by
          #17

          @JonB I got the result. So my file is 13.957 Gygabite (about 14 Gygabite). I read 1734480 int values which is equal to 6.9 Megabite. The result:
          SSD internal

          • fread/fseek 213 Seconds
          • QFile::map 86 Seconds

          HDD internal

          • fread/fseek 350 Seconds
          • QFile::map 216 Seconds

          HDD external

          • fread/fseek 1058 Seconds
          • QFile::map 655 Seconds

          So the fastest way is to use memory mapping. And the most crucial effect when working with big data is in whether I use external HDD or internal SSD/HDD.
          But I need to optimize my QFile::map code I said few messages above. Does anybody know how to do that?

          For fread/fseek I used the code:

          #include <iostream>
          #include <stdio.h>
          #include <QtEndian>
          #include <QVector>
          #include <boost/endian/buffers.hpp>
          #include <boost/static_assert.hpp>
          #include <armadillo>
          using namespace arma;
          using namespace boost::endian;
          
          
          int main()
          {
              char segyFile[]{"G:/DATA/STACK1_PRESTM.sgy"};
              FILE *pFile;
              unsigned long int segySize, nCol;
              unsigned short int dataFormatCode, nRow;
              // since 3600 byte we can represent segyFile as a matrix with number of rows = nRow and number of columns = nCol
              nRow = 2060;
              nCol = 1734480;
              QVector<quint32_le> FFID(nCol);
          
              pFile = fopen(segyFile, "rb");
              if (pFile == nullptr){
                std::cout << "Error opening segy-file!" << std::endl;
                return 0;
              }
          
              // read every (nRow-1)*4 byte starting from 3608 byte, in other word we read only 3rd row
              wall_clock timer;
              timer.tic();
              fseek (pFile , 3608, SEEK_SET);
              long int offset = (nRow-1)*4;
              for(unsigned long int i = 0; i < nCol; i++){
                  fread(&FFID[i], 4, 1, pFile);
                  fseek (pFile , offset , SEEK_CUR);
                  //std::cout << FFID[i] << std::endl;
              }
              double n0 = timer.toc();
              std::cout << n0 << std::endl;
          }
          

          And for QFile::map I used:

          #include <QCoreApplication>
          #include <QFile>
          #include <QVector>
          //#include <QIODevice>
          #include <armadillo>
          using namespace arma;
          
          int main()
          {
              char segyFile[]{"G:/DATA/STACK1_PRESTM.sgy"};
              QFile file(segyFile);
              if (!file.open(QIODevice::ReadOnly)) {
                   //handle error
              }
              uchar *memory = file.map(3608, file.size()-3608);
              if (memory) {
                  std::cout << "started..." << std::endl;
                  wall_clock timer;
                  qint64 fSize = file.size();
                  qint64 N = 1734480;
                  qint64 Nb = 2059*4;
                  QVector<uchar> FFID(N*4);
                  timer.tic();
                  for(qint64 i = 0; i < N; i++){
                      FFID[i] = memory[i*Nb];
                      FFID[i+1] = memory[i*Nb+1];
                      FFID[i+2] = memory[i*Nb+2];
                      FFID[i+3] = memory[i*Nb+3];
                  }
                  double n0 = timer.toc();
                  std::cout << n0 << std::endl;
                  std::cout << "finished!" << std::endl;
              }
          }
          
          J.HilkJ 1 Reply Last reply
          0
          • Please_Help_me_DP Please_Help_me_D

            @JonB I got the result. So my file is 13.957 Gygabite (about 14 Gygabite). I read 1734480 int values which is equal to 6.9 Megabite. The result:
            SSD internal

            • fread/fseek 213 Seconds
            • QFile::map 86 Seconds

            HDD internal

            • fread/fseek 350 Seconds
            • QFile::map 216 Seconds

            HDD external

            • fread/fseek 1058 Seconds
            • QFile::map 655 Seconds

            So the fastest way is to use memory mapping. And the most crucial effect when working with big data is in whether I use external HDD or internal SSD/HDD.
            But I need to optimize my QFile::map code I said few messages above. Does anybody know how to do that?

            For fread/fseek I used the code:

            #include <iostream>
            #include <stdio.h>
            #include <QtEndian>
            #include <QVector>
            #include <boost/endian/buffers.hpp>
            #include <boost/static_assert.hpp>
            #include <armadillo>
            using namespace arma;
            using namespace boost::endian;
            
            
            int main()
            {
                char segyFile[]{"G:/DATA/STACK1_PRESTM.sgy"};
                FILE *pFile;
                unsigned long int segySize, nCol;
                unsigned short int dataFormatCode, nRow;
                // since 3600 byte we can represent segyFile as a matrix with number of rows = nRow and number of columns = nCol
                nRow = 2060;
                nCol = 1734480;
                QVector<quint32_le> FFID(nCol);
            
                pFile = fopen(segyFile, "rb");
                if (pFile == nullptr){
                  std::cout << "Error opening segy-file!" << std::endl;
                  return 0;
                }
            
                // read every (nRow-1)*4 byte starting from 3608 byte, in other word we read only 3rd row
                wall_clock timer;
                timer.tic();
                fseek (pFile , 3608, SEEK_SET);
                long int offset = (nRow-1)*4;
                for(unsigned long int i = 0; i < nCol; i++){
                    fread(&FFID[i], 4, 1, pFile);
                    fseek (pFile , offset , SEEK_CUR);
                    //std::cout << FFID[i] << std::endl;
                }
                double n0 = timer.toc();
                std::cout << n0 << std::endl;
            }
            

            And for QFile::map I used:

            #include <QCoreApplication>
            #include <QFile>
            #include <QVector>
            //#include <QIODevice>
            #include <armadillo>
            using namespace arma;
            
            int main()
            {
                char segyFile[]{"G:/DATA/STACK1_PRESTM.sgy"};
                QFile file(segyFile);
                if (!file.open(QIODevice::ReadOnly)) {
                     //handle error
                }
                uchar *memory = file.map(3608, file.size()-3608);
                if (memory) {
                    std::cout << "started..." << std::endl;
                    wall_clock timer;
                    qint64 fSize = file.size();
                    qint64 N = 1734480;
                    qint64 Nb = 2059*4;
                    QVector<uchar> FFID(N*4);
                    timer.tic();
                    for(qint64 i = 0; i < N; i++){
                        FFID[i] = memory[i*Nb];
                        FFID[i+1] = memory[i*Nb+1];
                        FFID[i+2] = memory[i*Nb+2];
                        FFID[i+3] = memory[i*Nb+3];
                    }
                    double n0 = timer.toc();
                    std::cout << n0 << std::endl;
                    std::cout << "finished!" << std::endl;
                }
            }
            
            J.HilkJ Offline
            J.HilkJ Offline
            J.Hilk
            Moderators
            wrote on last edited by
            #18

            @Please_Help_me_D
            out of curiosity, do you build and run your tests in release mode?

            Compiler optimizations could go a long way in improving the speed, if you so far only ran debug builds.


            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.

            JonBJ Please_Help_me_DP 2 Replies Last reply
            1
            • J.HilkJ J.Hilk

              @Please_Help_me_D
              out of curiosity, do you build and run your tests in release mode?

              Compiler optimizations could go a long way in improving the speed, if you so far only ran debug builds.

              JonBJ Online
              JonBJ Online
              JonB
              wrote on last edited by JonB
              #19

              @J-Hilk
              Out of interest: I hope you are right, but I don't see much in code which spends its time seeking and reading a few bytes out of an enormous file that will benefit from any code optimization. Presumably all the time is being taken in the OS calls themselves....

              J.HilkJ 1 Reply Last reply
              2
              • JonBJ JonB

                @J-Hilk
                Out of interest: I hope you are right, but I don't see much in code which spends its time seeking and reading a few bytes out of an enormous file that will benefit from any code optimization. Presumably all the time is being taken in the OS calls themselves....

                J.HilkJ Offline
                J.HilkJ Offline
                J.Hilk
                Moderators
                wrote on last edited by
                #20

                @JonB said in Fastest way to read part of 300 Gigabyte binary file:

                Presumably all the time is being taken in the OS calls themselves....

                you mean, most time is lost during the network access calls? Possibly. But I would expect at least a couple of seconds improvements anyway :)


                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.

                JonBJ 1 Reply Last reply
                1
                • J.HilkJ J.Hilk

                  @JonB said in Fastest way to read part of 300 Gigabyte binary file:

                  Presumably all the time is being taken in the OS calls themselves....

                  you mean, most time is lost during the network access calls? Possibly. But I would expect at least a couple of seconds improvements anyway :)

                  JonBJ Online
                  JonBJ Online
                  JonB
                  wrote on last edited by JonB
                  #21

                  @J-Hilk
                  I would not, can't see how it would save anything here. But that aside, the OP wrote earlier:

                  @SGaist 15155 seconds (4 hours 12 min) it took to read these data.

                  Your "couple of seconds" is not going to be ground-breaking on that timing, is it? ;-)

                  OK, the OP has shown a newer, quicker timing. By all means try release optimization, worth a go :)

                  1 Reply Last reply
                  1
                  • J.HilkJ J.Hilk

                    @Please_Help_me_D
                    out of curiosity, do you build and run your tests in release mode?

                    Compiler optimizations could go a long way in improving the speed, if you so far only ran debug builds.

                    Please_Help_me_DP Offline
                    Please_Help_me_DP Offline
                    Please_Help_me_D
                    wrote on last edited by
                    #22

                    @J-Hilk Yes I did all the experiments in release mode

                    1 Reply Last reply
                    1
                    • Please_Help_me_DP Offline
                      Please_Help_me_DP Offline
                      Please_Help_me_D
                      wrote on last edited by
                      #23

                      @Please_Help_me_D said in Fastest way to read part of 300 Gigabyte binary file:

                      uchar *memory = file.map(3608, file.size()-3608);

                      is it possible to represent *memory as a heap of type qint32 rather than uchar?

                      jsulmJ 1 Reply Last reply
                      0
                      • Please_Help_me_DP Please_Help_me_D

                        @Please_Help_me_D said in Fastest way to read part of 300 Gigabyte binary file:

                        uchar *memory = file.map(3608, file.size()-3608);

                        is it possible to represent *memory as a heap of type qint32 rather than uchar?

                        jsulmJ Offline
                        jsulmJ Offline
                        jsulm
                        Lifetime Qt Champion
                        wrote on last edited by
                        #24

                        @Please_Help_me_D said in Fastest way to read part of 300 Gigabyte binary file:

                        is it possible to represent *memory as a heap of type qint32 rather than uchar?

                        Sure, cast the pointer to qint32*

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

                        JonBJ 1 Reply Last reply
                        3
                        • jsulmJ jsulm

                          @Please_Help_me_D said in Fastest way to read part of 300 Gigabyte binary file:

                          is it possible to represent *memory as a heap of type qint32 rather than uchar?

                          Sure, cast the pointer to qint32*

                          JonBJ Online
                          JonBJ Online
                          JonB
                          wrote on last edited by JonB
                          #25

                          @jsulm
                          Your answer is in principle correct. However, should we warn the OP that I'm thinking this will only "work" if the return result from the QFile::map() he calls (given his offsets) is suitably aligned at a 32-bit boundary for qint32 * to address without segmenting?? I don't see the Qt docs mentioning whether this is the case for the normally-uchar * return result?

                          jsulmJ J.HilkJ 2 Replies Last reply
                          3
                          • JonBJ JonB

                            @jsulm
                            Your answer is in principle correct. However, should we warn the OP that I'm thinking this will only "work" if the return result from the QFile::map() he calls (given his offsets) is suitably aligned at a 32-bit boundary for qint32 * to address without segmenting?? I don't see the Qt docs mentioning whether this is the case for the normally-uchar * return result?

                            jsulmJ Offline
                            jsulmJ Offline
                            jsulm
                            Lifetime Qt Champion
                            wrote on last edited by
                            #26

                            @JonB Could be, I'm not sure

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

                            1 Reply Last reply
                            1
                            • JonBJ JonB

                              @jsulm
                              Your answer is in principle correct. However, should we warn the OP that I'm thinking this will only "work" if the return result from the QFile::map() he calls (given his offsets) is suitably aligned at a 32-bit boundary for qint32 * to address without segmenting?? I don't see the Qt docs mentioning whether this is the case for the normally-uchar * return result?

                              J.HilkJ Offline
                              J.HilkJ Offline
                              J.Hilk
                              Moderators
                              wrote on last edited by
                              #27

                              @JonB
                              well if you take a look at the loop so far:

                              for(qint64 i = 0; i < N; i++){
                                          FFID[i] = memory[i*Nb];
                                          FFID[i+1] = memory[i*Nb+1];
                                          FFID[i+2] = memory[i*Nb+2];
                                          FFID[i+3] = memory[i*Nb+3];
                                      }
                              

                              no checks inside the loop nor before, so it's going to hard crash any way, when the file is not int32_t aligned.


                              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.

                              JonBJ 1 Reply Last reply
                              1
                              • J.HilkJ J.Hilk

                                @JonB
                                well if you take a look at the loop so far:

                                for(qint64 i = 0; i < N; i++){
                                            FFID[i] = memory[i*Nb];
                                            FFID[i+1] = memory[i*Nb+1];
                                            FFID[i+2] = memory[i*Nb+2];
                                            FFID[i+3] = memory[i*Nb+3];
                                        }
                                

                                no checks inside the loop nor before, so it's going to hard crash any way, when the file is not int32_t aligned.

                                JonBJ Online
                                JonBJ Online
                                JonB
                                wrote on last edited by JonB
                                #28

                                @J-Hilk
                                Umm, no, I don't see that. His current uchar *memory means it's only picking up bytes from there. And he made his FFID be QVector<uchar>. So he is copying one byte at a time (which is what I think he wants to get rid of), and current code won't have odd-boundary-memory-alignment issue. But new code with qint32* for uchar* could have problem....

                                If his offset is always like the example 7996 so it's divisible by 4 always then I would guess the return result from QFile::map() will not show any problem. This is an issue which does not arise when reading numbers from file, only from mapping, so just to be aware.

                                J.HilkJ Please_Help_me_DP 2 Replies Last reply
                                1
                                • JonBJ JonB

                                  @J-Hilk
                                  Umm, no, I don't see that. His current uchar *memory means it's only picking up bytes from there. And he made his FFID be QVector<uchar>. So he is copying one byte at a time (which is what I think he wants to get rid of), and current code won't have odd-boundary-memory-alignment issue. But new code with qint32* for uchar* could have problem....

                                  If his offset is always like the example 7996 so it's divisible by 4 always then I would guess the return result from QFile::map() will not show any problem. This is an issue which does not arise when reading numbers from file, only from mapping, so just to be aware.

                                  J.HilkJ Offline
                                  J.HilkJ Offline
                                  J.Hilk
                                  Moderators
                                  wrote on last edited by
                                  #29

                                  @JonB
                                  really? And what guarantees, that memory[i*Nb+3]; will be part of the valid memory ?

                                  I assume this, is, what the OP wants to do

                                  QVector<uchar> FFID(N*4); -> QVector<qint32> FFID(N);
                                  uchar *memory -> qint32 *memory
                                  
                                  and 
                                  for(qint64 i = 0; i < N; i++){
                                              FFID[i] = memory[i*Nb];
                                          }
                                  

                                  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
                                  • JonBJ JonB

                                    @J-Hilk
                                    Umm, no, I don't see that. His current uchar *memory means it's only picking up bytes from there. And he made his FFID be QVector<uchar>. So he is copying one byte at a time (which is what I think he wants to get rid of), and current code won't have odd-boundary-memory-alignment issue. But new code with qint32* for uchar* could have problem....

                                    If his offset is always like the example 7996 so it's divisible by 4 always then I would guess the return result from QFile::map() will not show any problem. This is an issue which does not arise when reading numbers from file, only from mapping, so just to be aware.

                                    Please_Help_me_DP Offline
                                    Please_Help_me_DP Offline
                                    Please_Help_me_D
                                    wrote on last edited by
                                    #30

                                    @jsulm thank you, that works!
                                    @JonB @J-Hilk I think I see what you are discussing and I keep that in mind.
                                    If I map the part of a file that is is not equal to N*4 (like in the code below) my program doesn't output any error or command line. Compiler says that it was succesfully built and application output throws that it started and one second later it is terminated.

                                    #include <QCoreApplication>
                                    #include <QFile>
                                    #include <QVector>
                                    //#include <QIODevice>
                                    #include <armadillo>
                                    using namespace arma;
                                    
                                    int main()
                                    {
                                        char segyFile[]{"C:/Users/tasik/Documents/Qt_Projects/raw_le.sgy"};
                                        QFile file(segyFile);
                                        if (!file.open(QIODevice::ReadOnly)) {
                                             //handle error
                                        }
                                        //qint32 *memory = new qint32;
                                        //(uchar*)&memory;
                                        uchar* memory = file.map(3608, file.size()-3607); // Here the mappable part file.size()-3607 has some remainder of the division by 4 
                                        (qint32*) memory;
                                        if (memory) {
                                            std::cout << "started..." << std::endl;
                                            wall_clock timer;
                                            qint64 fSize = file.size();
                                            qint64 N = 44861;
                                            qint64 Nb = 661*4;
                                            QVector<qint32> FFID(N);
                                            (uchar *)&FFID;
                                            timer.tic();
                                            for(qint64 i = 0; i < N; i++){
                                                FFID[i] = memory[i*Nb];
                                                /*FFID[i+1] = memory[i*Nb+1];
                                                FFID[i+2] = memory[i*Nb+2];
                                                FFID[i+3] = memory[i*Nb+3];*/
                                                std::cout << FFID[i] << std::endl;
                                            }
                                            double n0 = timer.toc();
                                            std::cout << n0 << std::endl;
                                            std::cout << "finished!" << std::endl;
                                        }
                                    }
                                    
                                    JonBJ 1 Reply Last reply
                                    0
                                    • Please_Help_me_DP Please_Help_me_D

                                      @jsulm thank you, that works!
                                      @JonB @J-Hilk I think I see what you are discussing and I keep that in mind.
                                      If I map the part of a file that is is not equal to N*4 (like in the code below) my program doesn't output any error or command line. Compiler says that it was succesfully built and application output throws that it started and one second later it is terminated.

                                      #include <QCoreApplication>
                                      #include <QFile>
                                      #include <QVector>
                                      //#include <QIODevice>
                                      #include <armadillo>
                                      using namespace arma;
                                      
                                      int main()
                                      {
                                          char segyFile[]{"C:/Users/tasik/Documents/Qt_Projects/raw_le.sgy"};
                                          QFile file(segyFile);
                                          if (!file.open(QIODevice::ReadOnly)) {
                                               //handle error
                                          }
                                          //qint32 *memory = new qint32;
                                          //(uchar*)&memory;
                                          uchar* memory = file.map(3608, file.size()-3607); // Here the mappable part file.size()-3607 has some remainder of the division by 4 
                                          (qint32*) memory;
                                          if (memory) {
                                              std::cout << "started..." << std::endl;
                                              wall_clock timer;
                                              qint64 fSize = file.size();
                                              qint64 N = 44861;
                                              qint64 Nb = 661*4;
                                              QVector<qint32> FFID(N);
                                              (uchar *)&FFID;
                                              timer.tic();
                                              for(qint64 i = 0; i < N; i++){
                                                  FFID[i] = memory[i*Nb];
                                                  /*FFID[i+1] = memory[i*Nb+1];
                                                  FFID[i+2] = memory[i*Nb+2];
                                                  FFID[i+3] = memory[i*Nb+3];*/
                                                  std::cout << FFID[i] << std::endl;
                                              }
                                              double n0 = timer.toc();
                                              std::cout << n0 << std::endl;
                                              std::cout << "finished!" << std::endl;
                                          }
                                      }
                                      
                                      JonBJ Online
                                      JonBJ Online
                                      JonB
                                      wrote on last edited by JonB
                                      #31

                                      @Please_Help_me_D said in Fastest way to read part of 300 Gigabyte binary file:

                                      and application output throws that it started and one second later it is terminated.

                                      Yes, that was my point. You won't get a compilation error. You would get a run-time "crash" on something like line FFID[i] = memory[i*Nb];. Under Linux you'd get a core dump (if enabled), under Windoze I don't know but would have thought it would bring up a message box of some kind.

                                      However, I haven't got time, I don't think the code you've written reflects this. For a start statements (qint32*) memory; and (uchar *)&FFID; are No-Ops (turn compiler warnings level up, you might get a warning of "no effect" for these lines, you should always develop with highest warning level you can). You haven't changed over the memory to qint32*, what you seem to think is how to do casts is wrong. This is C/C++ stuff. You'll want something more like

                                      qint32* memory = static_cast<qint32*>(file.map(3608, file.size()-3607));

                                      qint32* memory = reinterpret_cast<qint32*>(file.map(3608, file.size()-3607)); 
                                      

                                      but I haven't got time to sort you out. And if you do that you need to understand how to then index it, it won't be the same offsets as you used when it was uchar*. Don't try to change to qint32* for your accesses if you don't know what you're doing cast-wise in C/C++! :)

                                      Please_Help_me_DP 1 Reply Last reply
                                      2
                                      • JonBJ JonB

                                        @Please_Help_me_D said in Fastest way to read part of 300 Gigabyte binary file:

                                        and application output throws that it started and one second later it is terminated.

                                        Yes, that was my point. You won't get a compilation error. You would get a run-time "crash" on something like line FFID[i] = memory[i*Nb];. Under Linux you'd get a core dump (if enabled), under Windoze I don't know but would have thought it would bring up a message box of some kind.

                                        However, I haven't got time, I don't think the code you've written reflects this. For a start statements (qint32*) memory; and (uchar *)&FFID; are No-Ops (turn compiler warnings level up, you might get a warning of "no effect" for these lines, you should always develop with highest warning level you can). You haven't changed over the memory to qint32*, what you seem to think is how to do casts is wrong. This is C/C++ stuff. You'll want something more like

                                        qint32* memory = static_cast<qint32*>(file.map(3608, file.size()-3607));

                                        qint32* memory = reinterpret_cast<qint32*>(file.map(3608, file.size()-3607)); 
                                        

                                        but I haven't got time to sort you out. And if you do that you need to understand how to then index it, it won't be the same offsets as you used when it was uchar*. Don't try to change to qint32* for your accesses if you don't know what you're doing cast-wise in C/C++! :)

                                        Please_Help_me_DP Offline
                                        Please_Help_me_DP Offline
                                        Please_Help_me_D
                                        wrote on last edited by
                                        #32

                                        @JonB said in Fastest way to read part of 300 Gigabyte binary file:

                                        qint32* memory = static_cast<qint32*>(file.map(3608, file.size()-3607));

                                        thank you but this sends me an error:

                                        main.cpp:17:22: error: static_cast from 'uchar *' (aka 'unsigned char *') to 'qint32 *' (aka 'int *') is not allowed
                                        
                                        J.HilkJ 1 Reply Last reply
                                        0
                                        • Please_Help_me_DP Please_Help_me_D

                                          @JonB said in Fastest way to read part of 300 Gigabyte binary file:

                                          qint32* memory = static_cast<qint32*>(file.map(3608, file.size()-3607));

                                          thank you but this sends me an error:

                                          main.cpp:17:22: error: static_cast from 'uchar *' (aka 'unsigned char *') to 'qint32 *' (aka 'int *') is not allowed
                                          
                                          J.HilkJ Offline
                                          J.HilkJ Offline
                                          J.Hilk
                                          Moderators
                                          wrote on last edited by
                                          #33

                                          @Please_Help_me_D
                                          @JonB meant to write reinterpret_cast not static_cast there are few uses for reinterpret_cast but this is one :)


                                          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.

                                          Please_Help_me_DP 1 Reply Last reply
                                          2

                                          • Login

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