Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 7677081
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 31, 20262026-05-31T17:20:34+00:00 2026-05-31T17:20:34+00:00

I have a huge matrix that I divided it into some sub matrices and

  • 0

I have a huge matrix that I divided it into some sub matrices and I make some computation on it. After those computations I have to write that matrix into a single file for post processing. Is it possible to write results into a single text file and how can I do it?
For example we have a nxny matrix that is divided in y direction (each processes has a nxrank matrix) and we want to write the nx*ny matrix into a single text file.

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-31T17:20:36+00:00Added an answer on May 31, 2026 at 5:20 pm

    So it’s not a good idea to write large amounts of data as text. It’s really, really, slow, it generates unnecessarily large files, and it’s a pain to deal with. Large amounts of data should be written as binary, with only summary data for humans written as text. Make the stuff the computer is going to deal with easy for the computer, and only the stuff you’re actually going to sit down and read easy for you to deal with (eg, text).

    Whether you’re going to write as text or binary, you can use MPI-IO to coordinate your output to the file to generate one large file. We have a little tutorial on the topic (using MPI-IO, HDF5, and NetCDF) here. For MPI-IO, the trick is to define a type (here, a subarray) to describe the local layout of data in terms of the global layout of the file, and then write to the file using that as the “view”. Each file sees only its own view, and the MPI-IO library coordinates the output so that as long as the views are non-overlapping, everything comes out as one big file.

    If we were writing this out in binary, we’d just point MPI_Write to our data and be done with it; since we’re using text, we have to convert out data into a string. We define our array the way we normally would have, except instead of it being of MPI_FLOATs, it’s of a new type which is charspernum characters per number.

    The code follows:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <mpi.h>
    
    float **alloc2d(int n, int m) {
        float *data = malloc(n*m*sizeof(float));
        float **array = malloc(n*sizeof(float *));
        for (int i=0; i<n; i++)
            array[i] = &(data[i*m]);
        return array;
    }
    
    int main(int argc, char **argv) {
        int ierr, rank, size;
        MPI_Offset offset;
        MPI_File   file;
        MPI_Status status;
        MPI_Datatype num_as_string;
        MPI_Datatype localarray;
        const int nrows=10;
        const int ncols=10;
        float **data;
        char *const fmt="%8.3f ";
        char *const endfmt="%8.3f\n";
        int startrow, endrow, locnrows;
    
        const int charspernum=9;
    
        ierr = MPI_Init(&argc, &argv);
        ierr|= MPI_Comm_size(MPI_COMM_WORLD, &size);
        ierr|= MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    
        locnrows = nrows/size;
        startrow = rank * locnrows;
        endrow = startrow + locnrows - 1;
        if (rank == size-1) {
            endrow = nrows - 1;
            locnrows = endrow - startrow + 1;
        }
    
        /* allocate local data */
        data = alloc2d(locnrows, ncols);
    
        /* fill local data */
        for (int i=0; i<locnrows; i++) 
            for (int j=0; j<ncols; j++)
                data[i][j] = rank;
    
        /* each number is represented by charspernum chars */
        MPI_Type_contiguous(charspernum, MPI_CHAR, &num_as_string); 
        MPI_Type_commit(&num_as_string); 
    
        /* convert our data into txt */
        char *data_as_txt = malloc(locnrows*ncols*charspernum*sizeof(char));
        int count = 0;
        for (int i=0; i<locnrows; i++) {
            for (int j=0; j<ncols-1; j++) {
                sprintf(&data_as_txt[count*charspernum], fmt, data[i][j]);
                count++;
            }
            sprintf(&data_as_txt[count*charspernum], endfmt, data[i][ncols-1]);
            count++;
        }
    
        printf("%d: %s\n", rank, data_as_txt);
    
        /* create a type describing our piece of the array */
        int globalsizes[2] = {nrows, ncols};
        int localsizes [2] = {locnrows, ncols};
        int starts[2]      = {startrow, 0};
        int order          = MPI_ORDER_C;
    
        MPI_Type_create_subarray(2, globalsizes, localsizes, starts, order, num_as_string, &localarray);
        MPI_Type_commit(&localarray);
    
        /* open the file, and set the view */
        MPI_File_open(MPI_COMM_WORLD, "all-data.txt", 
                      MPI_MODE_CREATE|MPI_MODE_WRONLY,
                      MPI_INFO_NULL, &file);
    
        MPI_File_set_view(file, 0,  MPI_CHAR, localarray, 
                               "native", MPI_INFO_NULL);
    
        MPI_File_write_all(file, data_as_txt, locnrows*ncols, num_as_string, &status);
        MPI_File_close(&file);
    
        MPI_Type_free(&localarray);
        MPI_Type_free(&num_as_string);
    
        free(data[0]);
        free(data);
    
        MPI_Finalize();
        return 0;
    }
    

    Running gives:

    $ mpicc -o matrixastxt matrixastxt.c  -std=c99
    $ mpirun -np 4 ./matrixastxt
    $ more all-data.txt 
       0.000    0.000    0.000    0.000    0.000    0.000    0.000    0.000    0.000    0.000
       0.000    0.000    0.000    0.000    0.000    0.000    0.000    0.000    0.000    0.000
       1.000    1.000    1.000    1.000    1.000    1.000    1.000    1.000    1.000    1.000
       1.000    1.000    1.000    1.000    1.000    1.000    1.000    1.000    1.000    1.000
       2.000    2.000    2.000    2.000    2.000    2.000    2.000    2.000    2.000    2.000
       2.000    2.000    2.000    2.000    2.000    2.000    2.000    2.000    2.000    2.000
       3.000    3.000    3.000    3.000    3.000    3.000    3.000    3.000    3.000    3.000
       3.000    3.000    3.000    3.000    3.000    3.000    3.000    3.000    3.000    3.000
       3.000    3.000    3.000    3.000    3.000    3.000    3.000    3.000    3.000    3.000
       3.000    3.000    3.000    3.000    3.000    3.000    3.000    3.000    3.000    3.000
    
    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I have a huge database that is meant to be indexed, into which I
I have huge amount of txt files which contains 64x64 matrices consisting of integers.
I have a huge IQueryable that I want to export directly to Excel for
i have a huge sql query that is attached to the rowsource of a
I have a huge problem with this method im trying to make. I have
I have this huge data frame that has servernames, Date, CPU, memory as the
I have a sparsely populated matrix that's the result of a series of left
I have huge number of Word files I need to merge (join) into one
I have huge table with 1 million records, i would like to modify some
I have a 10GB CSV file which is essentially a huge square matrix. I

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.