硬汉嵌入式论坛

 找回密码
 立即注册
查看: 6155|回复: 20
收起左侧

[RL-FlashFS] 基于SPI Flash的FlashFS批量创建文件和写数据测试以及相关问题

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
发表于 2015-9-15 15:16:11 | 显示全部楼层 |阅读模式
1. 每次创建10个CSV文件,分别写入32字节数据。速度测试如下:
    (创建前挂载,10个文件都写完后卸载)
================================================
经过测试发现,随着数据大批量的写入,首次创建文件和后面创建的9个文件需要的时间越来越长
1.png



多次创建后发现速度剧增。
2.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
 楼主| 发表于 2015-9-15 15:22:02 | 显示全部楼层
只挂载一次,后面不再重复挂载和卸载,发现首次创建的时间基本跟后面9次一致了,但是随着不断的写入,
打开时间还是不断增加。估计FlashFS每次创建新文件都有一个查询的过程,随着文件数的大量增加,查询时间也长了。
3.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
 楼主| 发表于 2015-9-15 17:01:15 | 显示全部楼层
fout = fopen ("re.csv",   "a");   append方式坚决不可以用在SPI Flash上面,这样会造成写入耗时越来越长。
1.png


写到400次的时候,速度已经没法看了。
1.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
 楼主| 发表于 2015-9-15 17:27:40 | 显示全部楼层
对同一个文件进行重复重写fout = fopen ("re.csv", "w"); 测试了1000次,速度较稳定,每次写1024字节。
打开速度还算稳定。没有进行重复的加载和卸载。
1.png


测试进行了重复的加载和卸载,跟上面的速度基本一样。
2.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
 楼主| 发表于 2015-9-15 18:04:01 | 显示全部楼层
创建1000个文件,每次写64字节数据,测试结果如下,创建新文件的时间慢慢增加。
1.png

2.png

================================
重新写这1000个文件。
3.png

4.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
 楼主| 发表于 2015-9-15 19:00:49 | 显示全部楼层
创建到4000个文件时,速度已经无法容忍了,每次64字节。
1.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
 楼主| 发表于 2015-9-15 23:50:31 | 显示全部楼层
依次创建1000个文件,每次写数据1024字节,然后循环重写9次,一共是执行了10000次。
测试10000次.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
 楼主| 发表于 2015-9-15 23:59:17 | 显示全部楼层
测试总结:
1. 使用的时候切记不可以使用fopen (xxxxx, "w")模式,这样会造成文件的访问速度极其慢。
2. 创建的文件不要太多,最好不要超过1000个文件。文件越多访问速度也越慢。
3. 实际测试按照一页的倍数(256字节)进行写操作最好,这样基本没有文件碎片。
4. 不管创建的是多少文件,如果采用的是重复写已经创建的文件,打开文件的速度会一点点增加,
    最终趋于一个最大值,后基本不会再增加,而是变成小值后继续增加,如此循环,实际测试是这样的。
5. 挂载系统后,首次创建或者打开文件比较的耗时间,这点要注意。
6. 真正耗时间的不是读写文件耗时间,而是创建或者打开文件比较的耗时间。
=============================================================
a. 这么来说的话,实际使用SPI Flash的FlashFS时最好采用创建多个文件来做数据管理,但是创建
    的文件数最好不要太多,要不会造成访问速度极其慢。
b. 可以考虑删除文件然后重新创建文件进行数据记录,这样速度要快些。
    另外就是在文件打开的情况下,进行数据读写操作,记录了多条数据后再进行关闭文件,要不重新打开
   文件比较耗时间。只有关闭了文件,写的数据才会记录到SPI Flash里面。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
 楼主| 发表于 2015-9-17 09:12:58 | 显示全部楼层
实际测试还有一种非常实用的方法,而且很适合基于SPI Flash的FlashFS,可以挂载了文件系统以后,创建文件,创建后不要再关闭这个文件,然后使用
fwrite等函数写数据,写一次数据调用一次fflush即可。这样就不需要重复打开和关闭文件了,而且也不怕掉电问题。
回复

使用道具 举报

5

主题

578

回帖

593

积分

版主

Rank: 7Rank: 7Rank: 7

积分
593
发表于 2015-9-17 14:27:36 | 显示全部楼层
finit初始化文件系统时,会有检索整个文件系统fat和fsinfo的过程,导致运行巨慢。。。

估计打开文件时也有这种问题,你可以跟踪到反汇编里面,看看到底是哪个代码段耗费了这么多时间

我就是这样发现finit的问题的
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2015-10-23 09:14:58 | 显示全部楼层
我在使用中还发现,随着文件的不断变大,搜索文件函数ffind时间也越来越长。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
 楼主| 发表于 2015-10-23 09:24:24 | 显示全部楼层

回 zhou_jinbao 的帖子

zhou_jinbao:我在使用中还发现,随着文件的不断变大,搜索文件函数ffind时间也越来越长。 (2015-10-23 09:14) 
这个应该是他内部机制决定的,我现在的办法就是打开一个文件后不要关闭,通过函数
fwrite后,再fflush同步一下,这样数据就写入到SPI Flash,速度也很稳定了。

创建文件太多比较影响速度。
回复

使用道具 举报

0

主题

1

回帖

0

积分

新手上路

积分
0
发表于 2017-7-18 18:54:10 | 显示全部楼层
我手上做的一个项目想要使用FLASHFS,问题是写入的数据量一大,文件系统就会莫名其妙的损坏,掉电后再上电,fcheck通不过,必须要重新格式化才行,百思不得解啊!!
我用的单片机是LPC1343,  FLASH是W25X32;
高手可知道是啥原因?
ps: 不用FLASHFS, 直接操作FLASH 没有问题.
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
 楼主| 发表于 2017-7-19 01:38:00 | 显示全部楼层

回 stillman 的帖子

stillman:我手上做的一个项目想要使用FLASHFS,问题是写入的数据量一大,文件系统就会莫名其妙的损坏,掉电后再上电,fcheck通不过,必须要重新格式化才行,百思不得解啊!!
我用的单片机是LPC1343,  FLASH是W25X32;
高手可知道是啥原因?
ps: 不用FLASHFS, 直接操作FLASH 没有 .. (2017-07-18 18:54)
损坏倒是没有遇到过,主要是这个帖子里面说的速度慢的问题。
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2018-9-6 17:06:25 | 显示全部楼层
请问,如果需要对同一个文件重复写入数据,不采用fopen (xxxxx, “a”)  模式,可以怎么处理呢?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
 楼主| 发表于 2018-9-7 01:11:56 | 显示全部楼层
1604-9527 发表于 2018-9-6 17:06
请问,如果需要对同一个文件重复写入数据,不采用fopen (xxxxx, “a”)  模式,可以怎么处理呢?

这样的话,最好可以记录一批数据后,创建个新的文件继续。
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2018-9-7 20:32:58 | 显示全部楼层
eric2013 发表于 2018-9-7 01:11
这样的话,最好可以记录一批数据后,创建个新的文件继续。

感谢你的回复
现在做的硬件是SPI FLASH,上位机把很多个 APP分段下发给设备,在设备上能手动选择app来更新。如果采用创建新的文件的方法,一个APP就需要很多个文件来保存数据了,感觉实用会不太方便。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
 楼主| 发表于 2018-9-8 02:06:56 | 显示全部楼层
1604-9527 发表于 2018-9-7 20:32
感谢你的回复。
现在做的硬件是SPI FLASH,上位机把很多个 APP分段下发给设备,在设备上能手动 ...

下发APP应该问题不大,可以实际测试下性能。
回复

使用道具 举报

21

主题

61

回帖

124

积分

初级会员

积分
124
发表于 2023-12-26 08:52:59 | 显示全部楼层
eric2013 发表于 2015-9-15 23:59
测试总结:
1. 使用的时候切记不可以使用fopen (xxxxx, "w")模式,这样会造成文件的访问速度极其慢。
2.  ...

硬汉哥,我现在也遇到文件重复以“w”模式打开次数多了后,打开速度变慢的现象。但是文件是保存参数用的,当参数变化后,只能以"w"模式打开文件重写,目前不太好变更文件名。有什么办法能改善这种情况吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
 楼主| 发表于 2023-12-26 15:03:24 | 显示全部楼层
zhumx 发表于 2023-12-26 08:52
硬汉哥,我现在也遇到文件重复以“w”模式打开次数多了后,打开速度变慢的现象。但是文件是保存参数用的 ...

不要求速度的话,就慢慢写即可。也可以整体缓冲些后写入。
回复

使用道具 举报

21

主题

61

回帖

124

积分

初级会员

积分
124
发表于 2023-12-28 10:04:52 | 显示全部楼层
eric2013 发表于 2015-9-15 23:59
测试总结:
1. 使用的时候切记不可以使用fopen (xxxxx, "w")模式,这样会造成文件的访问速度极其慢。
2.  ...

“1. 使用的时候切记不可以使用fopen (xxxxx, "w")模式,这样会造成文件的访问速度极其慢。”这句话是不是打错了,是不可以使用fopen (xxxxx, "a")模式“?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-29 09:44 , Processed in 0.278938 second(s), 34 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表