【发布时间】:2016-11-28 14:13:30
【问题描述】:
这是我的最终目标:
我希望能够以任何可能的颜色深度生成给定尺寸的所有可用图像。
从某种意义上说,这并不复杂,我主要需要对表示图像的数组/矩阵的每个像素进行迭代,然后再次对给定像素的每个可能值进行迭代。
在现实生活中...不可能全部查看,因为即使是单色图像也有太多的可能性,而对于存储来说,也是一样的,即使是小尺寸的图像也会产生令人印象深刻的效果文件量大,硬盘容易饱和。
所以我这样做主要是为了好玩,因为我很快就能访问一个集群并想在上面尝试这个旧项目。但旧项目使用 SFML,效率不高(另外,终端中的 SFML 也不是一个好主意)
现在的问题:
由于我在每次迭代中大量使用像素的每个不同值,我想将它设置为一个全局常量,该常量将包含一个的每个可能值。所以它就像一个 16M 的 unsigned char[3] 数组。这提供了类似 50MB 的 RAM 仅用于它,所以不是太大而无法管理,最重要的是,一组不必动态生成的常量值和一个不错的(我认为?)增益时间和效率,因为数据是不断使用的。
问题是这个数组很大,只是写它会占用很大的空间(~640MB),我想知道这个文件的大小是否有问题,当我在调用它的同时尝试编译应用程序时,我收到 out of memory allocating xxxx bytes 的错误,有没有更好的方法来设置这个数组?还是这个想法没有我想象的那么好,有更好的方法来做我想做的事?
在 lauch 时生成数组的内容是我的第二个想法,但它花费了这么多时间,这并不有趣,我更喜欢它花在真正的图像生成上。
【问题讨论】:
-
也许你应该问问自己:“我真的需要这么大的数组,还是有更好的方法?”
-
检查
mmap。它允许将现有文件的内容映射到内存。您可以将值保存在 64MB 文件中,并在程序启动时将其映射到内存。 -
@JohnnyMopp 在应用程序的执行过程中,我多次获得这些值中的每一个,我不需要拥有它,并且可以在需要时从一个内部选择它们或更多循环或类似的东西,但为了提高效率,如果它已经在内存中,那对我来说甚至更好
-
这听起来像是典型的XY Problem。
-
似乎您的构建机器内存不足并崩溃了 gcc。尝试不同的编译器/计算机/操作系统?另外你不应该在标题中定义它,在标题中声明它并在其他地方的 .c 文件中定义它。