我遇到了一个大问题。问题在于
1)我有一个.dat文件(用于存储数据的dat文件)。它是一个25 MB的文件,其中包含 超过200K行的纬度和经度。这样一行的例子是
-59.083 -26.583 9.4 5.2 3.3 4.3 8.1 6.6 5.3 8.4 8.3 10.0 9.1 5.1
它的统计数据形成了1月份的纬度,经度,日照数据(小时),法布里......以及等等。
我有超过200K行,如上所述。
我的任务是计算纬度和经度的日照时数。假设我的纬度= 3.86082,经度= 100.50509;那我的任务就是在这个纬度和经度上找到每月的平均日照时数。但是第二个问题是,我不会将给定纬度和经度的精确匹配与我在文件中的精确匹配。首先,我必须找到最近的点,然后我必须计算日照时数。
我使用以下代码计算最近的点。但是由于文件中的大量数据需要花费大量时间
$file_name='grid_10min_sunp.dat';
$handle = fopen($file_name, "r");
$lat1=13.86082;
$lan1=100.50509;
$lat_lon_sunshines = make_sunshine_dict($file_name);
$closest = 500;
for($c=0;$c<count($lat_lon_sunshines);$c++)
{
$lat2=$lat_lon_sunshines[$c]['lat'];
$lan2=$lat_lon_sunshines[$c]['lan'];
$sunshines=$lat_lon_sunshines[$c]['sunshine'];
$lat_diff = abs(round((float)($lat1), 4)-$lat2);
if ($lat_diff < $closest)
{
$diff = $lat_diff + abs(round((float)($lan1), 4)-$lan2);
if($diff < $closest)
{
$closest = $diff;
$sunshinesfinal=$sunshines;
}
}
$sunshines='';
}
print_r($sunshinesfinal);die;
函数make_sunshine_dict($ file_name)也会遍历文件的每一行并准备一个数组,如下所示
$sunshines_dict = array();
$f = file_get_contents($file_name);
$handle = fopen($file_name, "r");
while($buffer = fgets($handle))
{
$tok = strtok($buffer, " \n\t");
$lat=$tok;
$latArray[]=$tok;
$tok = strtok(" \n\t");
$months = '';
$months = array();
for ($k = 0; $tok !== false; $k+=1)
{
if($k==0)
{
$lan=$tok;
$lanArray[]=$tok;
}
if($k!=0)
{
$months[] = $tok ;
"month $k : ".$months[$k]."<br>";
}
$tok = strtok(" \n\t");
}
$data[$kkk]['lat']=$lat;
$data[$kkk]['lan']=$lan;
foreach($months as $m=>$sunshine)
{
$sunshines=array();
$sumD = 0;
$iteration= 31;
for($n=1;$n<=$iteration;$n++)
{
$J = ($m+1)*$n;
$P = asin(.39795*cos(.2163108 + 2*atan(.9671396*tan(.00860*($J-186)))));
$value=(sin(0.8333*pi/180) + sin($lat*pi/180)*sin($P))/(cos($lat*pi/180)*cos($P));
/* $value ? ($value > 1 and 1) : $value;
$value ? ($value < -1 and -1): $value;*/
$D = 24 - ((24/pi) * acos($value));
$sumD = $sumD + $D;
}
$sunshinesdata=(($sumD/30)*(float)($sunshine)*.01);
$data[$kkk]['sunshine'][$m]=$sunshinesdata;
$sunshines='';
}
}
return $data;
请帮助,如果您需要更多信息,请告诉我
请注意我不能在这里使用默认的php函数来获取阳光信息beacsue我也考虑了云层覆盖和其他因素
答案 0 :(得分:0)
很多代码看起来都不对(只是计算出日照时数)。虽然,我承认,我在make_sunshine_dict
函数中失去了你在做什么。
在帮助您加快速度方面,您正在阅读两次文件:
$f = file_get_contents($file_name);
$handle = fopen($file_name, "r");
此外,您可以将Lat / Long坐标映射到网格中。换句话说,制作二维阵列,其中每行和每列分别代表1度纬度和1度经度。在读入文件时,将条目转储到网格中正确的lat / long存储桶中。当您需要找到最接近给定纬度/经度的位置时,您只需要将该位置与其桶中的点进行比较。
答案 1 :(得分:-1)
在Cron作业中每隔x个时间间隔将.dat加载到SQL数据库中,然后像往常一样查询数据库。