我有一个文本文件,其中包含一个具有矩阵维度的标题,然后是矩阵。下面是一个3x3矩阵的示例:
3 3
1 56 8
12 3 0
9 44 81我一直在使用MPI-IO获取垃圾值,发现它只适用于二进制文件,而不适用于文本文件。
我认为我可以读入字符流并转换为整数,但我不确定如何处理这个问题,因为矩阵元素的位数是可变的。我真的不知道该怎么做?
发布于 2017-01-12 00:12:25
通常,您知道写入二进制文件的内容的类型和数量(例如,所有整数、10 int 3 float等)。您可以读取字节数,但MPI二进制文件通常是作为整数个类型进行读/写的,在您的情况下是9个整数(因此位数并不重要)。你打开文件,读起来像这样,
call MPI_FILE_OPEN(MPI_COMM_WORLD, filename, &
MPI_MODE_RDONLY , MPI_INFO_NULL, fh, ierr)
bufsize = 3*3
allocate(buf(bufsize))
call MPI_FILE_READ_ALL(fh, buf, bufsize, MPI_integer, &
MPI_STATUS_IGNORE, ierr)对于可变的矩阵大小,您可以使用诸如MPI_File_get_size之类的东西来获取大小并计算出要读取的元素的数量。对于混合数据,您可以将二进制文件的第一部分(或最后一部分)作为头文件,您首先读取它,然后使用它来解码文件的其余部分。你仍然需要知道头部的格式,这可能会有问题,因为当你改变代码/头部格式时,你会破坏向后兼容性。这是使用HDF5 https://support.hdfgroup.org/HDF5/等数据格式的部分原因
发布于 2017-01-12 02:35:45
文本文件很棘手,因为你需要知道“字节”而不是“数字”。例如,1 1 1比10 15 123355短。
现在,如果您的约定是“每个数字都将被零填充到6位数”,那么您可以让每个进程从( -th /nprocs)*rank中读取
或者,您需要一个索引器来读取文件并记录矩阵中每一行的起始偏移量。
或者,正如您所观察到的,使用二进制数据会变得容易得多。
https://stackoverflow.com/questions/41572586
复制相似问题