在将大块数据写入文件时,我并不是很好。我有一个类似结构的模拟
typedef struct
{
int age;
float height;
float weight;
int friends [ 250000 ];
} Person;
我可以拥有多达25万人,每人拥有25万名朋友(一个集团)。显然这是一个很大的数据。如果我想保存每个结构,以便稍后加载它们,那么C中最有效的方法是什么?这是我到目前为止所考虑的内容
write
因为这会占用大量内存 编辑我正在寻找使用fwrite ()
的有效方法,即收集所有数据并写入单个文件是否更快,或者是否创建多个文件并避免收集所有数据的开销。
答案 0 :(得分:1)
你可以循环人,只需存储年龄,身高和体重成员(3个fwrites),然后存储friend_count,然后循环好朋友并逐个编写。所有这一切都与fwrite。您无需关心优化I / O,因为C库将为您缓冲并在需要时进行大量“写入”。
答案 1 :(得分:0)
我认为你正试图[部分]重新发明RDBMS(数据库)。重塑通常是一个坏主意。考虑将数据存储在免费的数据库系统中(例如Postgres)。它还有其他好处 - 您可以在不编写C代码的情况下查询您的数据 如果数据库听起来有点过分,请使用更简单的基于文件的数据库存储库,如BerkleyDB或SQLite。
答案 2 :(得分:0)
我对你的结构不是很清楚。
你有一个Person结构数组,friends []包含其他Persons数组的索引吗?
最好的方法是区分一个人和他的朋友。
这样你就拥有一个固定大小的Person,可以将所有人存储在一个文件中,并快速读回Person 12345的数据 - 它位于文件开头的filepos 12345 * sizeof(Person)。
Friends数组可以通过
保存在内存中int *Friends[MAXFRIENDS]
数组 - 您需要MAXFRIENDS * sizeof(int *)更多字节的内存,对于250.000朋友,它应该是64位系统上的2兆字节。小变化。每个指针都包含该人的friend []数组。
然后,Person的朋友进入目录中的文件,称为/ dd / cc / aabbccdd,其中aabbccdd由sprintf(“%08x”,PersonIndex)获得。使用dd / cc会导致树更加平衡。要编写好友文件,只需指向好友[PersonIndex]并根据需要编写多个好友索引(我将FriendsNumber存储在Person结构中)。
答案 3 :(得分:0)
我会查看像HDF5这样的库,这样你不仅可以在这台机器上读回文件,还可以将文件提供给其他人,并为您解决平台可移植性问题。