2011-1月笔记

    技术2022-11-28  25

    --- ls -R 显示当前目录及其子目录下的所有文件,即显示当前结点的所有叶子结点 -- 2011-1-4 昨天在Linux机器上调用oci数据批量插入接口进行测试时程序出现问题,插入的数据出现了很多0 *** glibc detected *** /root/test/noci/bin/mmo: munmap_chunk(): invalid pointer: 0x00000000005c3ba0 *** ======= Backtrace: ========= /lib64/libc.so.6[0x2b559bce431e] /oracle/app/oracle/product/11.1.0/db_1/lib/libclntsh.so.11.1[0x2b559a5d967c] /oracle/app/oracle/product/11.1.0/db_1/lib/libclntsh.so.11.1(nlnvdeb+0x23)[0x2b559a5d9add] 调试发现,是long和int的转换造成的 win32环境下 sizeof(long) == 4 sizeof(int) == 4 64位Linux下 sizeof(long) == 8 sizeof(int) == 4 涉及到这些的时候,需要特别注意 -- # ps -ef|grep div root 2793 1 0 13:43 ? 00:00:01 ./divfile root 21354 18996 0 16:54 pts/15 00:00:00 grep div root 21797 1 0 10:07 ? 00:00:00 ./divfile root 23578 1 0 10:32 ? 00:00:00 ./divfile ps -fu 有问题,不能够看到已经关闭的客户端启动的后台进程(nohup &) 对于 ps -fu 的使用需要注意 ------- 2011-1-5 装oracle客户端的机器也可以执行sqlplus sqlldr tnsping 等命令,因为安装路径下的bin目录下有这些可执行程序 sqlldr性能测试,导入的数据文件尽量不要太小,不要小于10MB,不然性能不能充分发挥,有牛刀小用之嫌 --49224条数据 20MB/s 远程导入 10MB/s sqlldr niop_adm/niop@102_db control=EVT_PDP_CREATE_CDR.ctl data=5021.txt log=log2.txt rows=2000 bindsize=25600000 readsize=30000000 direct=true silent=header,feedback errors=10000 sqlldr niop_adm/niop@102_db control=EVT_WAP_GET_CDR.ctl data=3001_1.txt log=log5.txt rows=2000 bindsize=25600000 readsize=30000000 direct=true silent=header,feedback errors=10000 -- 导入20MB数据,计21892条 用时 Elapsed time was: 00:00:01.23 CPU time was: 00:00:00.27 去掉direct=true后,进行同样的操作,cup time 变化显著 Elapsed time was: 00:00:01.25 CPU time was: 00:00:00.72 控制文件格式 LOAD DATA append INTO TABLE EVT_PDP_CREATE_CDR FIELDS TERMINATED BY '~' TRAILING NULLCOLS ( START_TIME, R_INDEX char(400) ) -- 1-6 公用头文件中的变量可以使用static来修饰以避免重复定义的问题 extern用来声明已经在其他地方定义的全局变量 -- 1-7 Linux 中提供的有数据存储的方法,在需要存储访问大量数据的情况下,可以考虑用这种方式去实现 dbm #include <ndbm.h> int dbm_clearerr(DBM *db); void dbm_close(DBM *db); int dbm_delete(DBM *db, datum key); -- iostat 查看磁盘io使用情况 avg-cpu: %user %nice %system %iowait %steal %idle 0.00 0.00 0.25 0.50 0.00 99.25 Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util sda 0.00 2.94 0.00 1.96 0.00 47.06 24.00 0.11 10.00 22.00 4.31 hda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 avg-cpu: %user %nice %system %iowait %steal %idle 0.00 0.00 19.64 0.00 0.00 80.36 Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util sda 0.00 3.85 0.00 49.04 0.00 415.38 8.47 6.13 123.53 20.31 99.62 hda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 avg-cpu: %user %nice %system %iowait %steal %idle 0.00 0.00 1.51 0.00 0.00 98.49 Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util sda 0.00 0.00 0.00 13.00 0.00 112.00 8.62 1.79 151.08 31.69 41.20 hda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 avg-cpu: %user %nice %system %iowait %steal %idle 0.00 0.00 0.00 0.00 0.00 100.00 ----- Linux自带的dbm存储库使用 可以理解成一个数据存储在磁盘上的map dbm1.c #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <fcntl.h> #include <ndbm.h> #include <string.h> //#include <gdbm.h> #define TEST_DB_FILE "/root/test/test/tdbm/dbm1_test" #define ITEMS_USED 3 /* A struct to use to test dbm */ struct test_data { char misc_chars[15]; int any_integer; char more_chars[21]; }; int main() { struct test_data items_to_store[ITEMS_USED]; struct test_data item_retrieved; char key_to_use[20]; int i, result; datum key_datum; datum data_datum; DBM *dbm_ptr; dbm_ptr = dbm_open(TEST_DB_FILE, O_RDWR | O_CREAT, 0666); if (!dbm_ptr) { fprintf(stderr, "Failed to open database/n"); exit(EXIT_FAILURE); } /* put some data in the structures */ memset(items_to_store, '/0', sizeof(items_to_store)); strcpy(items_to_store[0].misc_chars, "First!"); items_to_store[0].any_integer = 47; strcpy(items_to_store[0].more_chars, "foo"); strcpy(items_to_store[1].misc_chars, "bar"); items_to_store[1].any_integer = 13; strcpy(items_to_store[1].more_chars, "unlucky?"); strcpy(items_to_store[2].misc_chars, "Third"); items_to_store[2].any_integer = 3; strcpy(items_to_store[2].more_chars, "baz"); for (i = 0; i < ITEMS_USED; i++) { /* build a key to use */ sprintf(key_to_use, "%c%c%d", items_to_store.misc_chars[0], items_to_store.more_chars[0], items_to_store.any_integer); /* build the key datum strcture */ key_datum.dptr = (void *)key_to_use; key_datum.dsize = strlen(key_to_use); data_datum.dptr = (void *)&items_to_store; data_datum.dsize = sizeof(struct test_data); result = dbm_store(dbm_ptr, key_datum, data_datum, DBM_REPLACE); if (result != 0) { fprintf(stderr, "dbm_store failed on key %s/n", key_to_use); exit(2); } } /* for */ /* now try and retrieve some data */ sprintf(key_to_use, "bu%d", 13); /* this is the key for the second item */ key_datum.dptr = key_to_use; key_datum.dsize = strlen(key_to_use); data_datum = dbm_fetch(dbm_ptr, key_datum); if (data_datum.dptr) { printf("Data retrieved/n"); memcpy(&item_retrieved, data_datum.dptr, data_datum.dsize); printf("Retrieved item - %s %d %s/n", item_retrieved.misc_chars, item_retrieved.any_integer, item_retrieved.more_chars); } else { printf("No data found for key %s/n", key_to_use); } dbm_close(dbm_ptr); exit(EXIT_SUCCESS); } gcc -I/usr/local/include -L/usr/local/lib -o dbm1 dbm1.c -lgdbm 在库文件中查找可能要用到的库 /usr/lib64 # find . -name "*dbm*" gcc -o dbm1 dbm1.c -lndbm -- 1-10 对dbm存储库进行测试,插入100M条数据,当数据文件大小达到5GB的时候,插入变慢 插入10M数据的时候,速度还比较快 oracle 的头文件 ociap.h 中有oci函数的一些说明 -- 1-11 get the size of file ../data/tmp/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa failed 多个程序同时进行磁盘io的时候,性能都会显著下降 如 sqlldr性能受到影响 sqlldr出错 SQL*Loader-926: OCI error while executing delete/truncate (due to REPLACE/TRUNCATE keyword) for table EVT_WAP_GET_CDR ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired -- 1-12 一个奇怪的问题 白天的时候入库速度慢,晚上变快,可能时白天的时候其他进程消耗资源,或者网络资源被占用 mmap对文件建立内存映射 //把字符串写到一个缓存中,直接在尾部进行写,避免多次积累查找 char* Strcat(char * &ptail, char * str) { while (*str != '/0') { *ptail = *str; ptail++; str++; } *ptail = '/0'; return ptail; } 使用缓存的时候注意使用memset进行处理 g++ -g -o ../bin/divfile99 divfile112.cpp ../public/Configure.cpp -I . -I ../public --12. 监控当前数据库谁在运行什么SQL语句 SELECT osuser, username, sql_text from v$session a, v$sqltext b where a.sql_address =b.address order by address, piece; 在使用map的时候,如果想让一个key值对应着一组value,可以使用结构体指针去指向一个结构体 -- 1-13 可以根据ps 命令中的TTY 的值和who 命令来确定进程是由哪个用户哪个IP机器(终端)启动的 Linux64 环境中打开文件数的限制 #include <fstream.h> #include <iostream.h> int main() { fstream infile[2000]; for(int i = 0; i < 2000; i++) { char file[32] = {0}; sprintf(file, "%d.txt", i); infile.open(file, ios::out | ios::app); if(!infile) { cout << "open " << file << " failed" << endl; break; } } cout << "over" << endl; return 0; } open 1021.txt failed over -- 1-14 windows的剪切板上的内容太大了会导致有些程序如pl/sql Developer ctrl+c ctrl+v 不可用

     

     

    最新回复(0)