一行背景:我是Redis的开发者,一个NoSQL数据库.我正在实现的一个新功能是虚拟内存,因为Redis将所有数据都存储在内存中.由于VM Redis能够将很少使用的对象从内存传输到磁盘,因此有很多原因可以解释为什么这样做比让OS为我们进行交换工作要好得多(redis对象是由非连续分配的许多小对象构建的)地方,当Redis序列化到磁盘时,它们占用的空间比它们所在的内存页面少10倍,等等.
现在我有一个完全在Linux上运行的alpha实现,但在Mac OS X Snow Leopard上运行得不是很好.有时,当Redis尝试将页面从内存移动到磁盘时,redis进程会进入不间断等待状态几分钟.我无法调试这个,但这发生在调用fseeko()或fwrite().几分钟后,呼叫终于返回并且redis继续正常工作:没有崩溃.
传输的数据量非常小,类似于256字节.因此,它不应该是执行大量I/O的问题.
但是有一个关于交换文件的有趣细节,它是写操作的目标.这是一个大文件(26千兆字节)创建打开文件,fopen()然后使用放大ftruncate().最后文件是unlink()编辑,以便Redis继续引用它,但我们确信当Redis进程退出操作系统时,将真正释放交换文件.
好的,但我在这里有更多细节.顺便说一句,你甚至可以在Redis git中找到实际的代码,但鉴于这是一个相当复杂的系统,在五分钟内理解这一点并非易事.
非常感谢您的帮助.
嗨,在我的项目中,我要读取一个.bin文件,其中包含传感器数据short(16 bit values).我正在使用fread函数进入缓冲区,但我觉得读入没有正确发生.我的意思是我写的东西和我读的东西之间没有一致性.你们能否说出这里出了什么问题?这不是我项目中的代码......我只想在这里验证fread和fwrite功能.
#include<stdio.h>
void main()
{
FILE *fp = NULL;
short x[10] = {1,2,3,4,5,6,5000,6,-10,11};
short result[10];
fp=fopen("c:\\temp.bin", "wb");
if(fp != NULL)
{
fwrite(x, 2 /*sizeof(short)*/, 10 /*20/2*/, fp);
rewind(fp);
fread(result, 2 /*sizeof(short)*/, 10 /*20/2*/, fp);
}
else
exit(0);
printf("\nResult");
printf("\n%d",result[0]);
printf("\n%d",result[1]);
printf("\n%d",result[2]);
printf("\n%d",result[3]);
printf("\n%d",result[4]);
printf("\n%d",result[5]);
printf("\n%d",result[6]);
printf("\n%d",result[7]);
printf("\n%d",result[8]);
printf("\n%d",result[9]);
fclose(fp)
}
Run Code Online (Sandbox Code Playgroud)
我做了fread()(HEX值)后:
temp.bin:
01 02 03 04 05 06 e1 8e 88 06 ef bf b6 0b...
Run Code Online (Sandbox Code Playgroud)
我做了fwrite()之后
stdout: …Run Code Online (Sandbox Code Playgroud) 我有一个PHP脚本偶尔需要将大文件写入磁盘.使用file_put_contents(),如果该文件是足够大(大约2 MB这种情况下),PHP脚本运行的内存(PHP致命错误:用尽########字节允许内存大小).我知道我可以增加内存限制,但这对我来说似乎不是一个完整的解决方案 - 必须有更好的方法,对吧?
在PHP中将大文件写入磁盘的最佳方法是什么?
我正在使用C编程语言编写一个简单的文件分割器/合并程序.问题是,由于某种原因,fopen返回NULL,因此,我的程序在fwrite语句中崩溃.我该如何解决?
这是C文件:
int SplitFile(char* filename, char* output, size_t size)
{
char current_file_name[256];
int file_count = 0, i = 0;
FILE *file = fopen( filename, "rb" );
printf("split %s into chunks of %d named\n", filename, size);
if (!file)
return E_BAD_SOURCE;
else
{
output = (char *) malloc(size * sizeof(char));
if (output == NULL)
return E_NO_MEMORY;
else
{
int bytes_read = 0;
FILE *outFile;
do
{
bytes_read = fread(output, sizeof(char), size, file );
sprintf(current_file_name, "%s%04lu\n", "part", file_count++);
outFile …Run Code Online (Sandbox Code Playgroud) header("Content-Type: application/vnd.ms-excel; charset=utf-8");
header("Content-type: application/x-msexcel; charset=utf-8");
header("Content-Disposition: attachment; filename=abc.xsl");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false);
echo "Some Text"
Run Code Online (Sandbox Code Playgroud)
这里是使用php编写和下载xsl文件的代码,
我的问题是当我打开excel文件MS-Excel显示警告之前打开文件说
您尝试打开的文件格式与文件扩展名指定的格式不同... Blah blah
有什么与PHP代码删除此警告?内容写得正确.
我知道这是因为文件中写的内容是txt文件内容,文件扩展名不正确,即xls.解?
请不要建议使用任何库.
FILE *out=fopen64("text.txt","w+");
unsigned int write;
char *outbuf=new char[write];
//fill outbuf
printf("%i\n",ftello64(out));
fwrite(outbuf,sizeof(char),write,out);
printf("%i\n",write);
printf("%i\n",ftello64(out));
Run Code Online (Sandbox Code Playgroud)
输出:
0
25755
25868
Run Code Online (Sandbox Code Playgroud)
到底是怎么回事?write设置为25755,我告诉fwrite将多个字节写入文件,这是在开头,然后我在25755以外的位置?
如果我使用普通IO API读取和写入单个文件,则保证写入是基于每个块的原子.也就是说,如果我的write只修改了一个块,那么操作系统会保证写入整个块,或者根本不写入.
如何在内存映射文件上实现相同的效果?
内存映射文件只是字节数组,所以如果我修改字节数组,操作系统无法知道何时我认为写"完成",所以它可能(即使不太可能)在内存中交换内存我的块写操作的中间,实际上我写了半个块.
我需要某种形式的"进入/离开临界区",或"钉住"文件的页面到内存中,而我写它的一些方法.这样的事情存在吗?如果是这样,那可移植到常见的POSIX系统和Windows吗?
我一直在尝试将一个整数写入文件(打开模式是w).fprintf写得正确,但fwrite写了乱码:
int length;
char * word = "word";
counter = strlen(word);
fwrite(&length, sizeof(int), 1, file);
fwrite(word, sizeof(char), length, file);
Run Code Online (Sandbox Code Playgroud)
并且文件中的结果是:
字
但如果我改用fprintf,就像这样:
int length;
char * word = "word";
counter = strlen(firstWord);
fprintf(file, "%d", counter);
fwrite(word, sizeof(char), length, file);
Run Code Online (Sandbox Code Playgroud)
我在文件中得到了这个结果:
4word
谁能说出我做错了什么?谢谢!
更新:我最终想把写入改为二进制(我将以wb模式打开文件),我的实现会有区别吗?
我从来没有处理过编码和解码字符串,所以我就是这方面的新手.当我尝试使用Python中的file.write将我从另一个文件读取的内容写入临时文件时,我收到了一个UnicodeEncodeError.我收到以下错误:
UnicodeEncodeError: 'ascii' codec can't encode character u'\u201c' in position 41333: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)
这是我在我的代码中所做的.我正在读取XML文件并从"mydata"标签获取文本.然后我遍历mydata寻找CDATA
parser = etree.XMLParser(strip_cdata=False)
root = etree.parse(myfile.xml, parser)
data = root.findall('./mydata')
# iterate through list to find text (lua code) contained in elements containing CDATA
for item in myData:
myCode = item.text
# Write myCode to a temporary file.
tempDirectory = tempfile.mkdtemp(suffix="", prefix="TEST_THIS_")
file = open(tempDirectory + os.path.sep + "myCode.lua", "w")
file.write(myCode + "\n")
file.close()
Run Code Online (Sandbox Code Playgroud)
当我点击以下行时,它失败了UnicodeEncodeError:
file.write(myCode + "\n")
Run Code Online (Sandbox Code Playgroud)
我应该如何正确编码和解码?
我正在使用php fwrite()创建一个文件,我知道我的所有数据都是UTF8(我已经对此进行了大量测试 - 将数据保存到数据库并在普通网页上输出所有工作正常并报告为utf8.)但是我我被告知我输出的文件包含非utf8数据:(在bash(CentOS)中是否有命令检查文件的格式?
使用vim时,它将内容显示为:
Don~~~~你做什么...... It~~~~是一个很棒的网站...... We ~~ Yve刚刚推出/
任何帮助将不胜感激:确认文件是UTF8或如何将utf8内容写入文件.
UPDATE
为了澄清我如何知道我有UTF8数据,我做了以下事情:
到数据库我先运行它:
$enc = mb_detect_encoding($data);
$data = mb_convert_encoding($data, "UTF-8", $enc);
就在我运行fwrite之前,我已经检查了数据注意每个数据返回'IS utf-8'
if (strlen($data)==mb_strlen($data, 'UTF-8')) print 'NOT UTF-8';
else print 'IS utf-8';
谢谢!