- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个包含 1700 万个元素的 struct
动态分配数组。为了将它保存到磁盘,我写了
fwrite(StructList, sizeof(Struct), NumStructs, FilePointer)
在后面的步骤中,我使用等效的 fread
语句读取它,即使用 sizeof(Struct)
和 NumStructs
的计数.我预计生成的文件大约为 3.5 GB(这都是 x64)。
是否可以通过传递 sizeof(Struct) * NumStructs
作为大小和 1
作为计数来加快速度?我绞尽脑汁想知道为什么在具有 32 GB RAM(大量写入缓存)的快速计算机上写入操作可能需要 分钟。我已经运行了自制基准测试,缓存足够激进,前 800 MB 到 1 GB 的速度通常为 400 MB/秒。 PerfMon 显示它在 fwrite 期间消耗了一个内核的 100%。
我看到了问题here所以我要问的是,fwrite 中是否有一些循环可以通过告诉它写入大小为 n*s 的 1 个元素而不是大小为 n 的元素来“欺骗”以更快地运行。
编辑
我在 Release模式下运行了两次,两次我都放弃了等待。然后我在 Debug模式下运行它,因为我知道 fwrite
操作通常需要更长的时间。要写入的数据的确切大小为 4,368,892,928 字节。在所有这三种情况下,PerfMon 都显示两次突发的磁盘写入事件,间隔大约 30 秒,之后 CPU 达到一个内核的 100%。该文件此时为 73,924,608 字节。我在 fwrite
的两边都有断点,所以我知道它所在的位置。看起来肯定有什么东西卡住了,但我会让它运行一整夜看看。
编辑
把它放了一夜,它肯定卡在 fwrite
中,文件从未超过 70 MB。
最佳答案
这绝对是fwrite
的问题(VS2012和2010我都试过了)
从一个标准的 C++ 项目开始,我只更改了设置以在静态链接中使用多字节字符集、x64 目标和标准库的多线程调试版本。
以下代码成功(为了简洁没有错误检查):
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *fp;
long long n;
unsigned char *data;
n = 4LL * 1024 * 1024 * 1024 - 1;
data = (unsigned char *)malloc(n * sizeof(unsigned char));
fp = fopen("T:\\test.bin", "wb");
fwrite(data, sizeof(unsigned char), n, fp);
fclose(fp);
}
在我机器上的调试版本中,程序在大约 1 分钟内完成(malloc 只需要几秒钟,所以这主要是 fwrite
),平均消耗 30% 的 CPU。 PerfMon 显示写入完全发生在最后是一个 4 GB 的“闪存”(写入缓存)。
在 n 的赋值中将 - 1
更改为 + 1
并且您重现了问题:瞬时 100% CPU 使用率并且什么都没有写入。几分钟后,文件的大小仍然是 0 字节(回想一下我的实际代码,它设法转储了 70 MB 左右)。
这肯定是 fwrite
的问题,因为下面的代码可以很好地写入文件:
int main()
{
FILE *fp;
long long n;
long long counter = 0;
long long chunk;
unsigned char *data;
n = 4LL * 1024 * 1024 * 1024 + 1;
data = (unsigned char *)malloc(n * sizeof(unsigned char));
fp = fopen("T:\\test.bin", "wb");
while (counter < n)
{
chunk = min(n - counter, 100*1000);
fwrite(data+counter, sizeof(unsigned char), chunk, fp);
counter += chunk;
}
fclose(fp);
}
在我的机器上,这需要 45 秒而不是 1 分钟。 CPU 使用率不是恒定的,它是突发的,报告的 IO 写入比“单 block ”方法更分散。
如果速度的增加是错误的(也就是说,由于缓存),我会感到非常惊讶,因为我在编写包含所有相同数据的几个文件与包含随机数据的文件和报告的写入速度(与缓存)是一样的。所以我敢打赌,至少 fwrite
的这个实现不喜欢一次传递给它的大块。
我还测试了 fread
在 4 GB+1 的情况下关闭文件写入后立即读取并且它及时返回 - 最多几秒钟(这里没有真实数据所以我没有检查它)。
编辑
我使用 block 写入方法和 4 GB-1 文件的单个 fwrite 调用运行了一些测试(这两种方法都可以做到的最大大小)。多次运行程序(使用这样的代码打开文件,通过多次 fwrite 调用写入,关闭,然后再次打开,在一次调用中写入,然后关闭),毫无疑问, block 写入方法返回得更快。在最坏的情况下,它返回的时间是单次调用所需时间的 68%,而我最多只得到 20%。
关于c - fwrite() 性能远低于磁盘容量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21947743/
我有 5 个对象,a、b、c。d 和 e。 5个对象的hashcode如下: a => 72444 b => 110327396 c => 107151 d => 2017793190 e => 68
我目前正在为我当前的元素创建媒体查询,我目前面临的问题是某些东西导致我的导航栏在宽度低于 600 像素时无法响应。所发生的情况如附图所示。 这个问题其实我在之前的元素中曾经解决过一次,但是我对比了代码
我正在为网页编写媒体查询,并设法为 768 及以下版本编写媒体查询。但它不能正常工作。我想捕捉大多数 320 像素的手机(iphone4、iphone5、iphone3、asus galaxy 7、s
我开发了一个android应用,我所有android低于api 23的用户都无法连接到服务器,其余的都正常工作,从今天(2020-05-30)开始,在这一天之前多年来一直正常工作。 任何想法是什么原因
我正在上一门加密课,主要是作为学术练习,我一直在尝试获得尽可能高的速度。我发现了一些奇怪的事情,即异或字节数组的成本非常低,但在相同大小的字节数组上使用 arraycopy 的成本更高。我想这一定是一
我启动了一个新的应用程序,它大量使用了 firebase 功能以及支持库。我很快就达到了 65k dex 的限制,尽管考虑到应用程序的简单性,我没有理由应该在那里。我知道我需要排除某些我没有用的依赖项
我在 Lollipop 及以下发生了奇怪的崩溃。尝试从服务器下载文件时出现安全异常,但在运行 Marshmallow 及以上版本的设备中,应用程序不会崩溃。 Logcat: Caused by: ja
我正在构建一个相当简单的网站,我需要它具有一定的响应能力。 现在,当我调整浏览器大小时,导航菜单与 Logo 标题重叠,变得非常困惑。 HTML: Prince Innoce
如演示中所示,maxValue 设置为 2017 年,但图表一直到 2020 年。 如何让图表真正停在 2017 年?它在我的页面上占用了太多空间,因此我想对其进行优化 See demo fiddle
我正在用 python 尝试第二个 Project Euler 问题,想了解为什么我的代码不起作用。 此代码查找低于 400 万的偶数斐波那契数的总和 counter = 2 total = 0 wh
我想回答其中一个问题,这些问题有时是由销售人员试图在预算内进行销售而交给我们开发人员的。 我们有一个客户需要以下内容: 支持 AD 身份验证的文档管理系统(即使服务器可能位于其他位置 - 可能位于 V
我有一系列值(Pandas DF 或 Numpy Arr): vals = [0,1,3,4,5,5,4,2,1,0,-1,-2,-3,-2,3,5,8,4,2,0,-1,-3,-8,-20,-10,
当我创建使用 Google map API v2 的项目时,这条线有问题。 GoogleMap map = ((MapFragment) getFragmentManager().findFragme
如何在 UITableView 下方但在 TabBar 上方放置一个按钮,以便 UIButton 保持静止(不随 tableview 滚动)? 这是一张我想要帮凶的照片:http://i.imgur.
我正在使用 MockMvcResultMatchers 来测试我的 Controller 类。 这是一个示例代码 RequestBuilder request = get("/empl
function randomise(){ var ran_number=Math.floor(Math.random() * 100); return ran_number;
我正在尝试为 iOS9 以下的 NSManagedObjects init(context:) 方法“polyfill”。有没有办法为 iOS10 进行预处理器可用性检查? 这是否有意义,或者是否会出
我对 Web 开发的冒险还很陌生。我在使用的网站上遇到问题。在我达到大约 640px 之前,我的响应式设计没有问题。一旦我达到 640px 或将我的 html 全部压缩到左侧,除了我的主页英雄和导航栏
所以,我遇到的问题真的很难解释,但是,当页面宽度小于 600 像素时,我试图让我的导航行为有所不同。我几乎按照我想要的方式工作,但是当我点击菜单按钮时,当它低于 600px 时,它会在它下面的内容顶部
我在一个多语言网站上工作,我想在它的图标下方放置一个固定语言的菜单 div。我正在使用 Bootstrap 3。
我是一名优秀的程序员,十分优秀!