我試圖讀取大的二進制文件LAS這樣二進制文件讀取性能C++
struct format
{
double X;
double Y;
double Z;
short red;
short green;
short blue;
short alpha;
unsigned long intensity
// etc.
}
std::ifstream stream;
Point3 GetPoint()
{
format f;
stream.seekg(offset);
offset += sizeof(format);
stream.Read((char *)f, sizeof(format));
return Point3(f.X, f.Y, f.Z);
}
在主要功能:
Point3* points = new Point3[count]
for (int i = 0; i < count; i++)
points[i] = GetPoint();
此項操作需要有1800萬點的記錄約116秒。但在LAS工具中,讀取和開始顯示相同數據需要將近15秒的時間。
怎麼可以快7倍然後我的?多線程還是其他的東西?如果我的閱讀功能不好,那麼它會如何惡化7次呢?
我有一些關於內存映射文件的信息。將整個文件加載到內存的速度非常快,但LAS文件可能超過15GB,這是我的內存大小的過大,因此它將加載到虛擬內存。即使我有足夠的內存,我也必須用循環讀取內存映射文件。
有人可以給我一個關於這種情況的幫助嗎?
你只需要映射文件的一部分,而不是全部。 – Twifty
你確定'stream.Read((char *)f,sizeof(format))'會一直給你想要的結果嗎?我認爲format中的成員不必分配連續內存(絕對增加,但不能保證相鄰) – GuLearn
如果不使用內存映射,請使用大型數組讀取大量記錄。讀取的記錄越多,操作的效率就越高。對於每個讀取操作,驅動器必須定位文件中的開始或位置,然後讀取連續的字節。找到驅動器上的文件位置需要時間,並等待驅動器達到正確的速度。 –