我有一个C应用程序,它产生大量的输出,速度是至关重要的.该程序基本上是一个大型(8-12GB)二进制输入文件的循环,必须按顺序读取.在每次迭代中,处理读取的字节并生成输出并将其写入多个文件,但不会同时写入多个文件.因此,如果您处于生成输出的位置,并且有4个输出文件,则写入文件0或1或2,或3.在迭代结束时,我现在使用写入输出fwrite(),从而等待写入操作完成.输出操作总数很大,每个文件最多400万,文件输出大小从100mb到3.5GB不等.该程序在基本的多核处理器上运行.
我想在一个单独的线程中写输出,我知道这可以完成
我有两类问题,即概念和特定代码.
什么是最好的方法.请注意,应用程序应该可以移植到Linux,但是,我不知道这对于我选择的1-3是多么重要,因为我会编写一个关于任何内核/ API特定的包装器.对我来说,最重要的标准是速度.我已经读过,选项1不太可能提高程序的性能,并且内核在任何情况下都会为i/o操作创建新的线程,那么为什么不立即使用选项(2)并具有看似它的优势更容易编程(因为我没有使用选项(1)成功,请参阅下面的代码问题).
请注意,我阅读/sf/ask/258283161/,但我没有看到使用什么的动机基于应用程序的性质.所以我希望有人能给我一些建议,在我的情况下最好.同样来自Johnson M. Hart的书"Windows系统编程",我知道推荐使用线程,主要是因为简单.但是,它也会最快吗?
这个问题涉及我迄今为止进行异步I/O工作的尝试.我知道它是一大段代码,所以它不容易调查.无论如何,我真的很感激任何尝试.
为了减少执行时间我试着通过编写使用WINAPI一个新的线程的方式输出CreateFile()与FILE_FLAGGED_OVERLAP具有重叠结构.我已经创建了一个示例程序,我试图让它工作.但是,我遇到了两个问题:
该文件只在重叠模式打开,当我删除一个已经存在的文件(我已经尝试使用CreateFile不同的模式(CREATE_ALWAYS,CREATE_NEW,OPEN_EXISTING),但这并不能帮助).
只有第一个WriteFile是异步执行的.其余WriteFile命令是同步的.对于这个问题,我已经咨询过http://support.microsoft.com/kb/156932.似乎我遇到的问题与"对扩展其长度的文件的任何写操作将是同步的"这一事实有关.我已经尝试通过增加文件大小/有效数据大小(代码中的注释区域)来解决这个问题.但是,我仍然没有让它工作.我知道的事实,它可能是得到最有效地利用异步IO的我应该的情况下CreateFile用FILE_FLAG_NO_BUFFERING,但是我不能让这个为很好地工作.
请注意,程序在执行路径中创建一个大约120mb的文件.另外请注意,打印报表"不正常"不desireable,我想看看"可以做后台工作"出现在我的屏幕上......错在这里?
#include <windows.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ASYNC // remove this definition to run synchronously (i.e. using fwrite)
#ifdef ASYNC
struct _OVERLAPPED *pOverlapped;
HANDLE *pEventH;
HANDLE *pFile;
#else
FILE *pFile;
#endif
#define …Run Code Online (Sandbox Code Playgroud) 作为 Django 初学者,我遇到了一个非常基本的问题:根据两列的日期差异过滤表。我可以用原始 SQL 解决这个问题,但我真的很想使用基本的 Django 函数。
我有以下模型:
from django.db import models
import datetime
class Race(models.Model):
__tablename__ = 'race'
name = models.CharField(max_length=200)
country = models.CharField(max_length=100, null=True)
start = models.DateField()
end = models.DateField()
Run Code Online (Sandbox Code Playgroud)
我想提取持续时间超过 5 天的比赛。我可以以某种方式获得一个 timediff 列:
Race.objects.annotate(tdiff=F('end')-F('start')).first()
set1 = Race.objects.annotate(tdiff=F('end')-F('start')).all()
set1.first().tdiff
Run Code Online (Sandbox Code Playgroud)
现在,我如何过滤此列,我尝试的是:
min_diff = datetime.timedelta(5)
set1.filter(tdiff__gte=5).first()
set1.all().filter(tdiff__gte=min_diff)
set1.filter(tdiff__gte=min_diff).first()
Run Code Online (Sandbox Code Playgroud)
但这一切都给出了:
类型错误:预期的字符串或类似字节的对象
然后我考虑使用 extra 来获得 where 子句:
set2 = Race.objects.annotate(tdiff=F('end')-F('start'))
set2.first().tdiff
set2.all().extra(where=['tdiff>=5'])
Run Code Online (Sandbox Code Playgroud)
导致:
编程错误:列“tdiff”不存在
同一方向的问题包括这个和这个,但没有一个真正给出在新列上过滤的解决方案(这里是 tdiff)。
在完成这个问题时,我最终确实得到了我想要的结果:
Race.objects.filter(end__gte=F("start")+5)
print(Race.objects.filter(end__gte=F("start")+5).query)
Run Code Online (Sandbox Code Playgroud)
但我还是很想知道如何利用这个临时列 tdiff。
谢谢!
接受的答案正是我想要的:
from django.db.models import …Run Code Online (Sandbox Code Playgroud)