日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql 读取文件_关于mysql:逐行读取文件而不将整个文件加载到内存中

發布時間:2024/7/19 数据库 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql 读取文件_关于mysql:逐行读取文件而不将整个文件加载到内存中 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我正在使用50 Gb MySQL導出文件,并對其執行腳本操作列表以轉換為SQLite3可加載形式(我從這里得到的線索:腳本將mysql dump sql文件轉換為可以導入sqlite3的格式D b )。我尚未研究MySQL轉儲的結構,數據是從第三方獲得的。我可以看到它具有創建表并插入到語句中的功能,但是鑒于其大小,很難手動閱讀并理解其結構。

由于大小原因,無法通過管道傳輸文件。還有一個bash腳本,用于加載文件,然后逐行處理,例如

while read line

抱怨說它的內存不足。

因此,我嘗試使用awk或sed來選擇每一行(兩者均起作用),將該行寫入文件,然后將其通過perl腳本列表。這是我正在使用的awk腳本

$ awk -vvar="$x" 'NR==var{print;exit}' file > temp

其中x保留行號,然后通過perl命令發送temp,最后將它們附加到輸出文件中。

但是,盡管最初速度很快,但是由于開始必須遍歷越來越多的行,因此它很快會變慢。大約有40,000行。

有沒有人像這樣工作?有更快的方法嗎?

為什么腳本必須遍歷越來越多的行?我猜您沒有40000個文件,每個文件僅包含一行,但是您能否提供更多詳細信息?

命令$ sed -n 10 {p; q} file,將讀取前9個,并給我第10行并退出sed。隨著數量增加到40,000,它必須遍歷更多行才能給我特定的行。

好的,我知道了。是否可以選擇先將文件分割成50個1Gb文件?然后對每個塊進行處理,最后再次加入這些塊。

我在超級計算機上可以擁有的文件數量受到限制,因此盡管50個文件太多,我還是可以嘗試獲得一個最大數量的文件,該數量將好于1個。謝謝您的指導。

也許您也可以發布正在使用的腳本? (如果很大,您可以嘗試將其上傳到pastebin.com并在此處提供鏈接)。

如果您給出了所需的MySQL導出數據和SQLite3可加載格式的示例,那么這似乎是一個更多人可以幫助的問題。我假設您希望從輸入中讀取的每一行MySQL都輸出一行SQLite數據?您鏈接到的解決方案對我來說似乎很可怕,而且我相信它可以用單個Perl程序編寫。

您正在MySQL中執行SELECT * FROM table INTO OUTFILE table.txt,然后在SQLite中執行.import table.txt table?

我還沒有編寫MySQL轉儲,也沒有完全按照文件的大小來遵循結構。該問題已更新以反映這一點。此外,盡管sqlite3仍然抱怨格式,但建議將文件拆分為腳本有效。謝謝!

一次只需處理一行:

while read -r line

do

echo"$line"> temp

…process temp with Perl, etc…

done < file

至少這不會表現出二次讀取文件的行為,這就是您的awk腳本所做的。

它只讀取一次大文件,這是Big-O表示法的最佳性能(在恒定因子內)。

如您所說,如果這導致bash出現問題,則應使用Perl讀取每一行。 在50 GiB數據中有40,000行,您大約有1個? 每行數據的MiB。 盡管可能會導致Bash問題,但這不太可能導致Perl出現任何問題。 您可以修改現有的Perl一次讀取一行,也可以使用簡單的包裝Perl腳本來完成上述Bash腳本的工作。

wrapper.pl

假設您當前的處理腳本稱為script.pl:

#!/usr/bin/env perl

use strict;

use warnings;

my $file ="temp";

while (<>)

{

open my $fh,">", $file or die;

print $fh $_;

close $fh;

system"perl","script.pl", $file;

}

未經測試的代碼

調用:

perl wrapper.pl output

總結

以上是生活随笔為你收集整理的mysql 读取文件_关于mysql:逐行读取文件而不将整个文件加载到内存中的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。